Optional · Competitors · Apple only · step by step
For every app Apple publishes a feed with the newest reviews and a rating summary, both without sign-in. The script reads them for the apps you list as competitors, stores them apart from your own and puts them next to yours in the report: store rating, reviews, the same traffic light, the same topics, the same AI. Without entries nothing in the report changes.
config.jsonCompetitors ● VitaKasse App [Competitor] VitaKasse Store 4.4 188 new avg 1.84 79 % 1–2 ★ ● Medivo Kasse [Competitor] Medivo Store 3.8 120 new avg 2.10 70 % 1–2 ★ Own apps for comparison ● Kasse Nord App own app Store 4.5 13 new avg 3.62 31 % 1–2 ★ ● Kasse Nord Bonus own app Store 4.0 10 new avg 4.60 10 % 1–2 ★ What users say (AI) VitaKasse App Praise: sick note uploaded in seconds. Criticism: login failing since the update. Source: Apple’s public feed, newest 500 per country · traffic light by the same rules
Why
Whether 3.6 stars is good or bad depends on what the other apps in the same sector get. And whether a complaint is about your app or about the matter itself shows when the other apps’ users write the same thing.
Apple itself provides the customer review feed and the rating summary, for every app, for every visitor. The script reads only that. No scraping of web pages, no circumventing of protections, no access to other people’s accounts.
Competitors go through the same analysis as your apps: traffic light by the same rules, topics from the same word lists, summary by the same AI. The comparison is as fair as the data allows.
Third-party reviews live in their own folder, are not in the app filter and never enter your figures: overview, traffic light, key figures and charts show your apps only. They never trigger a notification. Without entries in the configuration there is no tab.
For Google Play this is deliberately left out. The Play Developer API returns reviews of your own apps only, and scraping the store website violates its terms of use. The script therefore rejects a Google entry under competitors.
Set up · steps 1 to 3
The template is in config/config.example.json. You need no credentials; the feed is public.
Open the app in the App Store and copy the link. The number after id is the app ID. For every country you care about you need the two-letter code (DE, AT, CH); the feed delivers reviews per country.
https://apps.apple.com/de/app/meine-barmer/id956752981
app IDEasiest in the setup in the browser, step competitors. By hand in config/config.json, next to apps of the customer, a list competitors. The id is yours to choose and becomes the folder name; vendor is the vendor shown in the table. countries is required.
"competitors": [
{ "id": "barmer", "name": "Meine BARMER", "enabled": true,
"vendor": "BARMER",
"apple": { "appId": "956752981", "countries": ["DE", "AT", "CH"] } },
{ "id": "tk-app", "name": "TK-App", "enabled": true,
"vendor": "Techniker Krankenkasse",
"apple": { "appId": "1163694230", "countries": ["DE"] } }
]The first run fetches up to 500 reviews per country and the store rating. After that the fetch is part of all and daily; it stops as soon as a page contains nothing new. In the menu: “Fetch data” → “Fetch competitors”.
./ratings.sh competitors --dry-run # check, save nothing ./ratings.sh competitors # fetch ./ratings.sh report # “Competitors” tab ✔ Meine BARMER · Competitors: 503 new · 15 requests · 1.5 s ✔ TK-App · Competitors: 506 new · 15 requests · 1.8 s
In the report
Everything about competitors appears only once some are configured and fetched. Your existing views stay as they are.
Two tables: the competitors on top, below them “Own apps for comparison” (your Apple apps). Per row traffic light, vendor, store rating with number of ratings, reviews and average of the last 90 days, share of 1–2 ★, current version and the traffic-light reason. Sortable. The filter is hidden on this tab so the comparison is always complete.
One card per app with praise, criticism and the three-sentence summary, your apps and the competition side by side. Every card carries the “AI” mark with provider, model and date.
A window for this app only: key figures, star distribution of the text reviews, store rating history, per version, per country, topics, AI praise and criticism, the newest 1–2-★ reviews with the store’s “helpful” votes. Plus the profile from the iTunes Lookup: vendor, genre, price, in the store since, version with date, size, minimum iOS, age rating, languages, what’s new, description, link to the App Store. Comparing happens in the table, not in the window.
Competitors cannot be selected in the filter. That way they can never distort a total, an average or a traffic light of your own apps. Everything about a third-party app is in the window on the “Competitors” tab.
A “Wettbewerber” section at the end of the overview, one row per third-party app. No separate file per competitor.
New 1–2-★ reviews of third-party apps and their traffic light never trigger a message. Notifications stay with your apps.
Limits
The report also lists these limits under “How complete is the data?”. They apply to everyone reading the same feed; there is no way around them.
To try it out. The debug menu (./debugmenu.sh) creates five invented insurer apps as competitors along with the test data and fetches nothing from Apple. The report then shows the badge “Demo data · invented” at the top.
Compare fairly. The reviews of an app with millions of users are not the same as those of an app with ten thousand. The 90-day average is a hint, not a verdict; the official store rating with its number of ratings is the more robust figure. And a topic that shows up across all apps of the sector is more likely about the matter than about one app.
Settings
The table is also in README.md (configuration section) and in API-APPLE.md, section 4a.
| Field | Meaning | Required |
|---|---|---|
competitors[].id | your own identifier, becomes the folder name; unique, also against apps | yes |
name | display name in the report | yes |
enabled | entry on or off | no, default true |
vendor | vendor for the table column; if missing the report uses the store name | no |
audience | size of the target group, as for own apps | no |
apple.appId | numeric app ID from the store link | yes |
countries (on the customer) | countries, two letters; applies to everything country-bound; the feed delivers per country, each country costs up to eleven requests per run | yes |
ai.analyzeCompetitors | analyse competitors too when an AI provider is active; never reply drafts or measures for third-party apps | no, default true |
Which data flows
The fetch talks only to itunes.apple.com, the same address that already delivers the store rating of your own apps. There is no intermediate step via us.
data/customers/<customer>/competitors/, readable by you aloneWith AI. If a provider is active and analyzeCompetitors is not switched off, the competitors’ reviews go to the same provider as your own, with the same fields (see Set up AI). That costs tokens per app; the first run with six competitors and 500 reviews each is the most expensive, after that only new reviews are sent.
If something goes wrong
The log is in data/logs/collect.log. An error with one competitor does not stop the others.
The customer has no competitors list, or all entries are "enabled": false. In all and daily this is not an error; the step is skipped silently.
The app ID is wrong, or the app is not in the store of that country. Copy the link again, check the country. Whatever was fetched before the error stays stored (status “partial”).
The feed delivers per country, so at least one code is required: ["DE"].
Competitors exist for Apple only. Remove the google key from the entry.
The app simply has no more in that country. Small apps often deliver only one or two pages.
Nothing has been fetched yet, or the report is older than the fetch. ./ratings.sh competitors, then ./ratings.sh report.