Skip to main content

Fetch a Steam game's public page stats + apply the Boxleiter wishlist→revenue rule of thumb. The honest version: a heuristic with documented limits.

Project description

steam-page-stats

CI PyPI License: MIT

Fetch a Steam game's public page stats and apply the Boxleiter rule of thumb to estimate lifetime revenue from the review count. The honest version of a useful heuristic.

pip install steam-page-stats
steam-page-stats 1145360
Hades  (appid 1145360)
  developer: Supergiant Games
  publisher: Supergiant Games
  genres: Action, Indie, RPG
  released: 17 Sep, 2020
  price: $24.99
  reviews: 205,000 total
  review score: 97.56%  positive

Boxleiter rule-of-thumb revenue estimate:
  low (×30):     $153.7M
  median (×50):  $256.1M
  high (×63):    $322.6M

  ⚠  This is a heuristic with ~24% of games off by >30% per the formula's
     own author. For an empirically-validated P10–P90 cone with calibrated
     80% coverage per genre, see https://steamforecast.app

Why this exists

The Boxleiter method (Mike Boxleiter, 2010s) is the de-facto rule of thumb for estimating lifetime Steam revenue from public page data:

revenue ≈ review_count × multiplier × price

Modern multiplier estimates range 30–63 sales per Steam review, with significant per-genre variance.

This package gives you:

  • A multiplier-bracketed estimate (low / median / high) so you see the uncertainty inherent in the heuristic
  • A clean Python API for use in your own analysis pipelines
  • A CLI for quick one-off lookups

The package is deliberately small. It does not try to be a calibrated forecaster — for that, you need per-genre stratification, conformal prediction intervals, and a labelled corpus to validate against. That's a hard problem; the rule of thumb is not.

If you need calibrated revenue ranges with empirically-validated 80% coverage on a held-out launch corpus, plus causal estimates for marketing levers, see the full forecaster at https://steamforecast.app — methodology and per-genre coverage stats are open at /methodology.

Install

pip install steam-page-stats

Or with optional dev dependencies for tests / linting:

pip install "steam-page-stats[dev]"

CLI usage

# human-readable
steam-page-stats 1145360

# machine-readable JSON
steam-page-stats 1145360 --json

# just page stats, skip Boxleiter
steam-page-stats 1145360 --no-boxleiter

Python API

import asyncio
from steam_page_stats import fetch_page_stats, boxleiter_estimate

async def main():
    stats = await fetch_page_stats(1145360)
    print(f"{stats.name}: {stats.review_count_total:,} reviews")

    if stats.review_count_total and stats.price_cents:
        est = boxleiter_estimate(stats.review_count_total, stats.price_cents)
        print(f"Lifetime revenue estimate: ${est.revenue_low_dollars:,.0f} – "
              f"${est.revenue_median_dollars:,.0f} – ${est.revenue_high_dollars:,.0f}")

asyncio.run(main())

For batch use, instantiate the client directly to share the underlying HTTP connection pool:

from steam_page_stats import SteamPageStatsClient

async def fetch_many(appids):
    async with SteamPageStatsClient(throttle_s=1.0) as client:
        for appid in appids:
            stats = await client.fetch(appid)
            yield stats

Rate limits + etiquette

This package uses Steam's public, unauthenticated Storefront and appreviews endpoints. Steam tolerates roughly 200 req/5min from a single IP across these endpoints. The default throttle of 1 req/sec keeps you well below that.

We send a transparent User-Agent header so you're identifiable per RFC etiquette:

steam-page-stats/0.1 (+https://github.com/GC108/steam-page-stats; calibration-sanity-check)

If you'd rather not advertise this package, override it:

async with SteamPageStatsClient(user_agent="my-research-bot/1.0") as c: ...

Limitations

The Boxleiter heuristic is structurally biased on:

  • Top-decile breakouts (Peak, Webfishing, etc.) — single-multiplier can't capture viral discovery. Per the formula's own author, ~24% of games are off by more than 30%.
  • Free-to-play with cosmetic monetization — the formula assumes revenue ∝ price × sales; F2P breaks that.
  • Long-tailed mid-tier where individual conversion ratios diverge by 10–20× at comparable wishlist counts (see steamforecast.app/methodology for the variance data).

For these cases, a calibrated cone with empirically-validated coverage ranges beats a single-number heuristic. The rule of thumb is a useful sanity check, not a budget-decision tool.

Development

git clone https://github.com/GC108/steam-page-stats
cd steam-page-stats
pip install -e ".[dev]"
pytest
ruff check .

License

MIT — see LICENSE.

Related

  • steamforecast.app — calibrated revenue cones with empirically-validated 80% coverage per genre, causal marketing-lever estimates, and Total Lift Attribution to recover paid campaign wishlists Steam's UTM dashboard misses.
  • Steam Web API documentation
  • Boxleiter method, Mike Boxleiter (2014, updated 2023) — the original formulation and 2023 retrospective.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

steam_page_stats-0.1.1.tar.gz (10.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

steam_page_stats-0.1.1-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

Details for the file steam_page_stats-0.1.1.tar.gz.

File metadata

  • Download URL: steam_page_stats-0.1.1.tar.gz
  • Upload date:
  • Size: 10.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for steam_page_stats-0.1.1.tar.gz
Algorithm Hash digest
SHA256 cc2f59e07769a182cb4c62d2106da2ac4ac6ee5d7d54d4e9f241254da2d619d8
MD5 38edd262ebdf30aa127ba3b75375c79e
BLAKE2b-256 9ceb582db838781abb64620232c4c0faad9baa14f3096292a33f2f4b0f5bcdb0

See more details on using hashes here.

Provenance

The following attestation bundles were made for steam_page_stats-0.1.1.tar.gz:

Publisher: publish.yml on GC108/steam-page-stats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file steam_page_stats-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for steam_page_stats-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 0898b1ebe4e298b17a50c2db60d5f6ffe81f5cde65bae7c27e1cfd916fd82a26
MD5 0d9cca6815be77ffead5a3fae0722957
BLAKE2b-256 b469df30a1a4582d97bd2d71d4298b0c03b2ede163eac504ab38440f00a6d052

See more details on using hashes here.

Provenance

The following attestation bundles were made for steam_page_stats-0.1.1-py3-none-any.whl:

Publisher: publish.yml on GC108/steam-page-stats

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page