App Store reviews to BigQuery

Every App Store review as a row in your own project, carrying the storefront country and the language it was written in. The two questions App Store Connect will not answer become ordinary SQL.

Set up in under five minutes • No demo required

App Store BigQuery 128,412 rows

Destination table

fjord-analytics.reviews.app_store_reviews

review_date score country review_text
2026-09-07 5.0 Australia Lost signal above the treeline, map kept working.
2026-09-07 1.0 Japan 検索に日本語が入力できません
2026-09-06 4.0 Canada Route planning is quick. Water refills next?
2026-09-06 5.0 Germany Höhenlinien sind gut lesbar, auch bei Sonne.
Synced 12 minutes ago
  • chewy
  • qonto
  • brevo
  • jins
  • filmin
  • lugg

The question App Store Connect will not answer

App Store Connect gives you a rating and a list. It will never tell you that seven storefronts sit between 4.4 and 4.7 while Japan is at 1.6, because it has no way of putting those numbers beside each other. In BigQuery that is a GROUP BY on a column you already have, and it is five lines of SQL.

Apple files every App Store review under a storefront, and Reviewflowz writes that storefront onto every row as the country. So the country is real data rather than a guess from the language, and a market-shaped problem has a shape you can query for.

That shape is the diagnosis. A crash reads as every country dropping together. A translated string that no longer fits its button, or a search box that stopped accepting Japanese input, reads as one country falling while the rest do not move. Which country tells you which team to call.

The follow-up is a WHERE clause, because the full review text is an ordinary column. Count the reviews mentioning search since the first of the month, split by country, and you have the bug report before anyone files one.

BigQuery Query editor
-- rating by storefront since 4.2 shipped
SELECT country,
       ROUND(AVG(score), 1) AS rating,
       COUNT(*) AS reviews
FROM `fjord-analytics.reviews.app_store_reviews`
WHERE review_date >= '2026-09-01'
GROUP BY country
ORDER BY rating
Results 5 rows in 0.4s
country rating reviews
Japan 1.6 214
Spain 4.4 96
United States 4.6 1,240
Germany 4.6 331
Australia 4.7 188

A table, not a report

What lands is a table, not a dashboard somebody else designed. One row per App Store review: the review id, the timestamp, the score, the title, the full text, the country, the language, the tags and a link back to the review. Plain columns, nothing to reverse engineer.

The review text is a STRING column like any other, so the term you care about is a WHERE clause instead of an afternoon of reading. Reviewflowz detects the language from the text itself, which is why a German review left on the Swiss storefront still groups the way you expect.

Tags arrive filled. Reviewflowz reads each review in whatever language it was written in and files it under the themes your users raise, so a Japanese one-star about search and an English one about the same thing carry the same tag and count as one number.

One column you will not find, and it is worth saying out loud: Apple does not attach the app version to a review, so nothing downstream of it can carry one. Anyone selling per-build review quality off an App Store feed is selling a field Apple does not publish.

BigQuery fjord-analytics.reviews.app_store_reviews Schema
review_id STRING One row per review, stable
review_date TIMESTAMP When it was posted
score FLOAT64 1.0 to 5.0
title STRING The review headline
review_text STRING The full text, queryable
country STRING Apple’s storefront territory
language STRING Detected from the text, ISO 639-1
tags ARRAY Themes, filled as reviews arrive
review_url STRING Back to the review on the store

How the rows actually get into BigQuery

There is no managed BigQuery destination to click, and this page will not pretend there is. What Reviewflowz gives you is a Google Sheet in your own Drive that it keeps current: a new App Store review is a new row within half an hour, an edited review updates its row, and a review Apple removes loses its row.

BigQuery reads a Drive-backed Google Sheet as an external table. One CREATE EXTERNAL TABLE against the sheet URL and app_store_reviews exists in your dataset, queries like any other table, and is right at query time because it reads the sheet, not a copy. Nothing to schedule, nothing to keep alive.

If you want a native partitioned table instead, the Review API is the other road. Poll it or take the webhook, then load it with the job you already run for every other source. That is work your data team writes once, and calling it a job rather than a checkbox is the point.

Either way the history comes with it. On a paid plan, one click loads every past App Store review, so the trend line starts full rather than filling over the next quarter. Connect the listing on Tuesday morning and you can query three years of reviews that afternoon.

every 30 min at query time
App Store R Google Sheets BigQuery
App Store
reviews
Reviewflowz Sheet in
your Drive
External
table
BigQuery Run once
CREATE EXTERNAL TABLE
  reviews.app_store_reviews
OPTIONS (
  format = 'GOOGLE_SHEETS',
  uris = ['https://docs.google.com/...'],
  sheet_range = 'Reviews'
)

Prefer a native partitioned table? The other road is the Review API and a load job you run on your own schedule.

The build Apple never attached to the review

Because Apple leaves the app version off a review, no review tool can tell you which build a one-star is about. Your warehouse can, and it does it with data you already own: a releases table holding the version and the date it shipped, which is the exact thing Apple is missing.

Join the two on the date and per-version review quality comes back. 4.1 sits at 4.6 across two thousand reviews, 4.2 drops to 2.9 across four hundred, and the 4.2.1 hotfix recovers to 4.5. That is the release post-mortem, and it is one join rather than a project.

The same move works on everything else you keep. Subscriptions, ticket volume, crash-free sessions, revenue by storefront: join on the key or the date range you already use, and whether the people who leave one-stars churn faster stops being a hunch and becomes a number.

This is the whole reason to put reviews in a warehouse rather than read them in a tool. A review tool can only ever tell you about reviews. The warehouse is where a review sits next to the release, the crash and the refund that explain it.

App Store app_store_reviews
review_date
score
country
releases your data
version
shipped_at
JOIN ON r.review_date >= x.shipped_at
version avg rating reviews
4.1 4.6 2,104
4.2 2.9 488
4.2.1 4.5 301

Your project, your rules

The table lives in your Google Cloud project, in the region you picked, under the IAM you already run and the retention policy you already wrote. Granting a data scientist access is the same few clicks it is for every other dataset, and taking it away again is the same few clicks back.

You choose what flows out. Pick the App Store listings, and per listing pick the storefronts. Leave the country list empty and every market the app sells in is included, or name Japan and Germany and only those rows arrive. Add a score filter and the table holds one to three stars and nothing else.

So the localisation team gets a dataset of just its markets without anyone maintaining a filter, and the support lead gets one of just the low scores, from the same account and the same listings. Two scopes feeding two tables is a normal setup, not a workaround.

One thing worth knowing before you size anything: App Store review volume is not evenly spread. It piles up in the hours after a release and the days after a featuring, so a table that looks quiet all month collects most of its rows in two afternoons.

BigQuery

Your Google Cloud project

fjord-analytics.reviews

Location

europe-west1

Access

your IAM

Retention

your policy

What flows in

Listings
Fjord Fjord Pro
Countries
JapanGermanyUnited States + 31 more

Leave it empty and every storefront is included.

Rating
1 to 3 stars selected

Reviews belong next to the release that caused them.

Set up in under five minutes. No demo required.

Is there a native BigQuery connector?

No, and it would be dishonest to imply one. Reviewflowz syncs a Google Sheet in your own Drive, and BigQuery reads that sheet as an external table with a single CREATE EXTERNAL TABLE statement. If you would rather have a native partitioned table, the Review API plus a scheduled load job gets you there. Both are ordinary work for a data team, and neither needs a demo.

How current is the table?

Reviewflowz checks the App Store every two hours by default, every ten minutes on the high-frequency setting, and syncs the sheet every 30 minutes. An external table reads the sheet at query time, so a query you run now sees whatever the last sync wrote. A load job into a native table is as current as its schedule.

Which columns does the table have?

The review id, the app, the platform, the review date and time, the score, the title, the full text, the storefront country, the detected language, the reviewer nickname, the tags and a link back to the review. Apple does not attach the app version to a review, so there is no version column. Join your own releases table on the date to get per-build numbers back.

Does the first load include our App Store history?

Yes, on a paid plan: one click loads every past App Store review, so the trend line is full from day one rather than in three months. During the free trial new reviews arrive as they are posted, and the history loads once you subscribe.

What happens when a reviewer edits their review after we ship the fix?

The row updates in place with the new score and text, so a query over it moves with the correction. When Apple removes a review from the store, the row is deleted on the next sync, which means the table never holds a version of the truth the App Store no longer does.

Do I need a demo to get started?

No. Connect your App Store listing and the Google Sheet yourself in under five minutes, then run one CREATE EXTERNAL TABLE against it. 14 day free trial, no credit card.