The Signal
App ratings and GitHub activity are public, free, and almost entirely ignored by traditional analysis. A consumer app with a declining star rating is losing users before it shows up in MAU numbers. A tech company with slowing GitHub commit activity is slowing R&D before it shows up in product launches. These are 1–2 quarter leading indicators hiding in plain sight.
Two Data Layers
Layer 1: App Store Intelligence (iTunes API — Completely Free)
- iTunes Search API requires no key, no registration
- Track: average rating, rating count (velocity proxy), current version, last updated date
- Google Play requires scraping (use google-play-scraper Python library)
Layer 2: GitHub Intelligence (GitHub API — Free Tier 60 req/min Unauthenticated, 5000/hr Authenticated)
- Track: commit frequency (last 52 weeks), contributor count, star growth, release cadence
- Useful for: tech companies, dev tool companies, any company with public open-source projects
HEARTBEAT Configuration
name: digital_health_monitor
schedule: "0 10 * * 1"
steps:
- fetch_appstore:
apps:
- name: "Robinhood"
apple_id: "938003185"
bundle_id: "com.robinhood.broker"
- name: "Coinbase"
apple_id: "886427560"
bundle_id: "com.coinbase.CoinbaseMobile"
- fetch_github:
repos:
- "stripe/stripe-python"
- "vercel/next.js"
- "shopify/storefront-api-learning-kit"
- compare:
to: last_week
flag_rating_drop_exceeds: 0.1
flag_commit_drop_pct: 30
- llm:
prompt: |
Analyze these app store and GitHub metrics for my watchlist.
Flag: rating drops, slowing commit velocity, unusual review spikes.
Data: {{ app_data }} {{ github_data }}
- notify:
subject: "📱 Digital Health Brief — {{ date }}"
iTunes Search API Implementation
Fetch App Metadata
import httpx
def get_app_rating(apple_id: str, country: str = "us") -> dict:
"""Fetch app metadata from iTunes Search API — completely free, no key required."""
url = f"https://itunes.apple.com/lookup?id={apple_id}&country={country}"
r = httpx.get(url)
results = r.json().get("results", [])
if not results:
return {}
app = results[0]
return {
"name": app.get("trackName"),
"rating": app.get("averageUserRating"),
"rating_count": app.get("userRatingCount"),
"current_version_rating": app.get("averageUserRatingForCurrentVersion"),
"version": app.get("version"),
"updated": app.get("currentVersionReleaseDate"),
"price": app.get("price", 0)
}
GitHub API Implementation
Fetch Commit Activity
import httpx
def get_commit_activity(owner: str, repo: str, token: str = None) -> list:
"""
Returns weekly commit counts for the last 52 weeks.
Rate limit: 60/hr unauthenticated, 5000/hr with token.
"""
url = f"https://api.github.com/repos/{owner}/{repo}/stats/commit_activity"
headers = {"Accept": "application/vnd.github.v3+json"}
if token:
headers["Authorization"] = f"token {token}"
r = httpx.get(url, headers=headers)
if r.status_code == 202: # GitHub is computing stats, retry in ~2s
return []
return [{"week": w["week"], "total": w["total"]} for w in (r.json() or [])]
def commit_velocity_trend(activity: list, recent_weeks: int = 4) -> dict:
if len(activity) < recent_weeks + 8:
return {}
recent = sum(w["total"] for w in activity[-recent_weeks:]) / recent_weeks
baseline = sum(w["total"] for w in activity[-16:-recent_weeks]) / 12
return {"recent_avg": round(recent, 1), "baseline_avg": round(baseline, 1),
"change_pct": round(((recent - baseline) / baseline * 100) if baseline > 0 else 0, 1)}
Analyze Recent Reviews
def analyze_recent_reviews(apple_id: str, country: str = "us") -> dict:
"""Fetch recent App Store reviews via RSS feed (no auth required)."""
url = f"https://itunes.apple.com/{country}/rss/customerreviews/page=1/id={apple_id}/sortby=mostrecent/json"
r = httpx.get(url)
data = r.json()
entries = data.get("feed", {}).get("entry", [])[1:] # skip first (app info)
reviews = [{"rating": int(e["im:rating"]["label"]), "title": e["title"]["label"],
"content": e["content"]["label"]} for e in entries[:20]]
avg = sum(r["rating"] for r in reviews) / len(reviews) if reviews else 0
return {"count": len(reviews), "avg_rating": round(avg, 2), "reviews": reviews}
Frequently Asked Questions
No — Apple doesn't expose download counts publicly. Rating count growth is used as a proxy for download velocity.
Stripe, Vercel, Shopify, Cloudflare, MongoDB, HashiCorp, Twilio, GitHub itself, and any company that open-sources significant code.
Search the iTunes API: itunes.apple.com/search?term=AppName&entity=software&limit=5
Next Steps
Now that you can track product health signals, move to Part 5: Web Intelligence & Price Monitoring to layer web scraping and competitive intelligence on top of your existing data pipelines.