Skip to main content
📱 PART 4 OF 5

App Store & GitHub Intelligence — Digital Health Metrics That Lead Revenue

ℹ️ Informational only. Alternative data sources vary in accuracy and timeliness. Nothing here is investment advice. Always verify data independently before making any decisions.

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)

Layer 2: GitHub Intelligence (GitHub API — Free Tier 60 req/min Unauthenticated, 5000/hr Authenticated)

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

Q: Does the iTunes API give download numbers?

No — Apple doesn't expose download counts publicly. Rating count growth is used as a proxy for download velocity.

Q: Which companies have useful GitHub repos to track?

Stripe, Vercel, Shopify, Cloudflare, MongoDB, HashiCorp, Twilio, GitHub itself, and any company that open-sources significant code.

Q: How do I find a company's Apple ID?

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.