DEV Community

Cover image for Babbel has a 4.5 on Google Play. Its last 20 German reviews average 1.9.
Matthew Curtis
Matthew Curtis

Posted on

Babbel has a 4.5 on Google Play. Its last 20 German reviews average 1.9.

Babbel's rating in the German Play Store is 4.48. On November 9 I pulled its 20 most recent German reviews and they averaged 1.9 stars. Fifteen of the twenty were one or two stars. Babbel's support team had replied to eighteen of them.

None of that is hidden. It sits on public Play Store pages, next to where the app ranks in the grossing chart, when it last shipped and what it's rated in every other country. The catch is that nobody is going to click through twelve store pages every morning to read it.

So this post does it in one run. I'm using Google Play Store Scraper, an Apify Actor I wrote, to watch four language-learning apps (Duolingo, Babbel, Busuu, Memrise) in the US, German and Brazilian stores. The run made 75 requests, took 32 seconds and cost $0.08. It came back with 72 app records, 1,440 reviews and 362 chart positions, and nothing failed. Every number below is from that run.

If you do product or ASO work and have a competitive set to watch, or you're picking which country to launch in next, or you use chart rank as a stand-in for revenue, swap your own apps into the input and you'll get the same tables.

The input

{
  "queries": [
    "com.duolingo",
    "com.babbel.mobile.android.en",
    "com.busuu.android.enc",
    "com.memrise.android.memrisecompanion",
    "chart:GROSSING:EDUCATION"
  ],
  "locales": ["en-US", "de-DE", "pt-BR"],
  "maxItems": 72,
  "reviewsPerApp": 20
}
Enter fullscreen mode Exit fullscreen mode

Package ids are the id= part of a Play Store URL. Each query runs once per store front, so the four apps come to 12 records. I capped the run at 72, which leaves 60 for the chart: the top 20 of Top Grossing › Education in each country, with full details.

The chart query takes any collection and category (chart:TOP_FREE:FINANCE, chart:GROSSING:GAME_PUZZLE, and so on). A plain keyword like "language learning" works too and ranks apps by search position instead of chart position. Google shows about 25–30 results per term when you aren't signed in.

Pricing is $0.005 to start a run plus $0.001 per record, so 72 records is $0.077. Reviews come inside the app record and aren't charged. There's no Google account or API key involved anywhere.

Where everyone ranks

App US grossing rank (Education) Germany Brazil US rating DE rating BR rating Last update
Duolingo 1 1 1 4.75 4.65 4.86 2026-11-09
Babbel 5 2 17 4.57 4.48 4.80 2026-11-05 (v22.22.0)
Busuu 39 8 15 4.65 4.58 4.82 2026-11-03 (v32.51.1)
Memrise 109 not in the 73 not in the 89 4.40 4.19 4.74 2026-10-19

Duolingo is first in all three countries, which nobody needed a scraper to guess. The other rows say more. Babbel is #2 at home in Germany and #17 in Brazil. Busuu is #39 in the US but #8 in Germany and #15 in Brazil, so most of its money is coming from outside the US. Memrise is #109 in the US and isn't on the German or Brazilian chart at all.

About that #109. The dataset only holds full records for the top 20 per country, but the run also saves a RANKINGS record to the key-value store with every position Google publishes. On the day of this run that was 200 in the US, 73 in Germany and 89 in Brazil. That's how an app sitting at #39 or #109 still gets a rank without you paying for 200 detail records.

One more thing in that table: all four apps have their highest rating in Brazil and their lowest in Germany. Ratings are per country (the rating count is global), so if you only ever check your home store you're looking at one score out of several.

What the newest reviews say

App Store Avg stars, newest 20 1–2★ of 20 Developer replies of 20 Period covered
Duolingo US 4.40 2 0 1 day
Duolingo DE 3.90 4 0 1 day
Duolingo BR 4.85 0 0 1 day
Babbel US 2.45 12 18 6 days
Babbel DE 1.90 15 18 15 days
Babbel BR 2.85 9 15 12 weeks
Busuu US 4.30 2 0 2 days
Busuu DE 3.55 6 0 17 days
Busuu BR 3.90 5 0 4 days
Memrise US 3.20 7 2 3 weeks
Memrise DE 3.50 5 3 4 months
Memrise BR 3.60 5 3 2 months

Back to Babbel. Its newest reviews average between 1.9 and 2.9 stars depending on the country, against lifetime ratings of 4.5 to 4.8. And somebody at Babbel answers nearly all of them: 18 of 20 in the US and in Germany, 15 of 20 in Brazil. Duolingo and Busuu answered none of their 60. If you compete with Babbel, those replies are a free look at how their support team handles complaints.

Before anyone reads too much into this: twenty reviews is a small sample, and people who bother to write a review skew unhappy. I treat it as a tripwire. When an app trips it, raise reviewsPerApp for that app (it goes up to 200 and still costs nothing extra) and read properly.

The last column is worth a look too. It's how long each app took to collect those 20 reviews, which makes it a rough gauge of review volume. Duolingo fills the list in a day in every country. Memrise needs four months in Germany.

Each review comes with score, text (cut at 300 characters), date, appVersion, thumbsUp, replyText and replyDate. Since the app version is on every review, "what have people complained about since 22.22.0" is a one-line filter.

Who is actually on the chart

Six apps make the Education grossing top 20 in all three countries: Duolingo, Learna AI, PictureThis, Babbel, Simply Piano and Simply Draw.

Everything else is local. The US list has ClassDojo, Reading.com, Epic and Lingvano (sign language). Germany has phase6, sofatutor and NeuroNation. Brazil has four exam-prep apps (Qconcursos, Tec Concursos, Gran Cursos Questões, Passei Direto) plus 12min. None of those show up anywhere on the other two countries' charts.

Then there are the AI English tutors. Praktika and Loora hold #5–#6 in Germany and #3–#4 in Brazil, and neither is in the US top 20. That's no surprise for apps that teach English, but it does mean a language app in Berlin or São Paulo is up against two competitors that never appear if you only watch the US chart.

chart-top20-by-country.csv in the sample data has the three lists side by side.

Turning it into an alert

I don't want to rerun this by hand and compare tables, so I schedule it through Dataset Diff & Alert Monitor, another Actor of mine. It runs the scraper, compares the result with the previous run and posts only what changed to Slack, Discord, Telegram or a webhook.

{
  "sourceActorId": "mdcurt/google-play-app-scraper",
  "sourceInput": {
    "queries": ["com.duolingo", "com.babbel.mobile.android.en", "com.busuu.android.enc", "com.memrise.android.memrisecompanion"],
    "locales": ["en-US", "de-DE", "pt-BR"],
    "maxItems": 12
  },
  "keyFields": ["url"],
  "watchFields": ["version", "scoreText", "price", "inAppPurchaseRange", "title"],
  "notifyOn": ["changed"],
  "labelField": "title",
  "urlField": "url",
  "slackWebhookUrl": "https://hooks.slack.com/services/…"
}
Enter fullscreen mode Exit fullscreen mode

This config is a release-and-pricing watch. You get one message when an app ships a new version, when its displayed rating moves a step (4.6 to 4.5), when the in-app price range changes or when the listing gets renamed.

Two choices in there aren't obvious. url is the key because it's unique per app and store front. And the watch is on scoreText, not score, because the raw average shifts in the fifth decimal place on every run and you'd be pinged every time.

On cost: twelve records are $0.017 on the scraper. The monitor adds $0.02 to start, $0.001 per row it compares and $0.01 per notification it sends. A check where nothing changed comes to about $0.05.

Rank changes take one more step. Schedule the full input from the top of this post weekly and compare the RANKINGS record from two runs. lists[].items[] is {rank, id, title}, so spotting a newcomer in the top 20, or your own app slipping, is about ten lines of script. Or one prompt, if you'd rather hand it to an agent.

Calling it from an agent

{"queries": ["com.duolingo"], "maxItems": 1} returns one record in about a second for $0.006. Add "reviewsPerApp": 20 and the newest reviews come back in the same record at no extra charge. For a ranked list with no detail requests, use "queries": ["chart:GROSSING:EDUCATION"], "fetchDetails": false.

The Actor needs no login and runs with limited permissions, so it works through Apify's MCP server at https://mcp.apify.com/?tools=mdcurt/google-play-app-scraper.

Fine print

  • Chart positions are Google's public Top Grossing list for that store front at the moment of the run. They move daily.
  • A chart goes as deep as Google publishes, which tops out at 200 positions and is often less (73 in Germany and 89 in Brazil here).
  • ratingsCount is the global count. score and the reviews belong to the store front.
  • You can list as many store fronts in locales as you like. Each app-and-country pair is one $0.001 record.
  • Review text is cut at 300 characters, and textTruncated tells you when that happened. Reviewer display names are in the Actor's output, but I removed them from the sample file.
  • This covers Google Play only. It doesn't touch the App Store.
  • The sample was collected from Google's public pages without a login: 75 requests, none failed, none blocked.
  • The 72 records, the full rank map and the two CSVs behind the tables are in the Actor's source under examples/competitor-app-watch/.

If you run this on your own category and something odd turns up, leave a comment. I'd like to see it.

Top comments (0)