Google Play Monitor — Competitor Android App Tracking
Pricing
from $10.00 / 1,000 app change detecteds
Google Play Monitor — Competitor Android App Tracking
Track any Android app across storefronts and get only what changed: new releases with notes, price moves, rating shifts, install-tier jumps and delistings.
Pricing
from $10.00 / 1,000 app change detecteds
Rating
0.0
(0)
Developer
Mohanad Alshaka
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Watch any Android app and get only what changed since your last run: new releases with their notes, price moves, rating shifts, install-tier jumps, and delistings.
Point it at your competitors, schedule it daily, and each run returns a short list of what moved instead of a fresh dump of the same records.
Pairs with App Store Monitor if you track both platforms.
Honest note on reliability
Apple publishes a JSON API. Google does not. Play store data lives inside AF_initDataCallback blobs in the page, and every field is reached by a positional index path into an undocumented nested array. Those indices move when Google reshuffles the page.
A naive extractor handles that badly: the path silently starts returning nothing, rows come back full of nulls, and nothing distinguishes "this app genuinely has no version" from "the parser broke three weeks ago."
So every field here is validated against the shape it must have:
- A rating must be a number between 0 and 5.
97is rejected, not reported. - A title must be a non-empty string.
- A price must be a non-negative number of micros.
A field that is missing-but-required, or present-but-wrong-shaped, marks the extraction unhealthy. Unhealthy records are reported in the run log and in RUN_SUMMARY, and excluded from the saved baseline so a broken parse cannot corrupt future comparisons and produce a storm of false changes on the next run.
That is the difference between an Actor that breaks loudly and one that lies quietly.
What a change row looks like
{"country": "us","changeType": "new_version","reasons": ["new_version", "rating_fell"],"title": "Spotify: Music and Podcasts","developer": "Spotify AB","previousVersion": "9.0.10.100","version": "9.0.12.100","releaseNotes": "We are always making changes and improvements.","previousScore": 4.39,"score": 4.34,"scoreMove": -0.05,"newRatingsSinceLastRun": 18422,"installsText": "1,000,000,000+","installsApprox": 1000000000,"price": 0,"currency": "USD","url": "https://play.google.com/store/apps/details?id=com.spotify.music"}
Change types: new_version, app_updated, price_drop, price_rise, became_paid, became_free, rating_fell, rating_rose, installs_tier_change, title_change, developer_change, delisted, new_app, first_seen.
Three details that matter in practice
Not every app has a version. Apps shipping per-device builds show "Varies with device" and carry no version at all. Instagram, WhatsApp and Telegram are all like this. That is a legitimate null, not a broken parse, and it is treated as such. Apps that do publish one, such as Firefox or Edge, are tracked normally.
Rating noise is filtered. An app with 31 million ratings drifts every day. A move must clear scoreDelta (0.05 by default) before it counts, so real movement is not buried under decimal drift.
Storefronts differ. Price, currency and rating are per country, so each storefront is tracked against its own baseline.
Every row carries the same fields, including delisted rows, so CSV exports stay rectangular.
Input
| Field | What it does |
|---|---|
apps | Package names or Play Store URLs. Both work and can be mixed. |
countries | Two-letter storefront codes, each tracked separately. |
language | Language for titles and release notes. |
mode | changes returns only what moved. snapshot returns everything each time. |
stateKey | Names the saved baseline. One key per watchlist. |
scoreDelta | How far the rating must move to count. Default 0.05. |
Daily competitor watch
{"apps": ["com.spotify.music","com.instagram.android","https://play.google.com/store/apps/details?id=com.whatsapp"],"countries": ["us", "gb", "sa"],"mode": "changes","stateKey": "competitors"}
The first run records the baseline. Every run after returns just the moves.
Notes and limits
- Public store pages only. No developer account, no Play Console credentials, nothing behind a login.
- One request is made per app per storefront, so a large watchlist across many countries takes proportionally longer.
requestDelayMscontrols the pacing. - An app returning 404 on a storefront is treated as unavailable there, and reported as
delistedif you were explicitly tracking it. changesmode keeps its baseline in a named key-value store. Deleting that store resets it and the next run reportsfirst_seenagain.
Development
npm installnpm testnode src/main.js