Real-time Steam sales monitoring for indie game developers. Single Python file, zero dependencies.
After launching my game on Steam, I caught myself refreshing the Steamworks sales page twelve times a day. So I built this.
Steam Dashboard is a self-hosted monitoring tool that pulls your sales, wishlists, reviews, and player counts into a single real-time view — with Telegram alerts so you never have to refresh again.
- Real-time sales & revenue tracking — sales, revenue, refunds, all in one place
- Telegram instant alerts — new sale, new review, player spike
- Country-level breakdown — sales and wishlist data by region
- Concurrent player monitoring — trend charts with historical data
- Wishlist tracking — adds, removes, and conversion rates
- Web-based setup wizard — no config files to edit, ever
- Multi-game support — monitor all your titles from one dashboard
- Korean & English UI — auto-detects browser language
- Mobile-friendly — responsive design, check sales from your phone
- Single Python file — no pip install, no virtualenv, no Docker
- 100% self-hosted — your data never leaves your server
# 1. Clone
git clone https://github.com/chihyunn/steam-dashboard.git
cd steam-dashboard
# 2. Run
python3 dashboard.py
# 3. Open browser
# → http://localhost:8081
# → Setup wizard guides you through everythingThat's it. No requirements.txt, no .env files, no database setup.
| Setup Wizard | Dashboard |
|---|---|
![]() |
![]() |
| Mobile View | Telegram Alerts |
|---|---|
![]() |
![]() |
The setup wizard will ask for two keys. Here's where to find them.
This key accesses public data: player counts, reviews, app details.
- Go to steamcommunity.com/dev/apikey
- Enter any domain name (e.g.,
localhost) - Copy the key
This is the one that's hard to find. It accesses sales, revenue, and wishlist data.
- Log into partner.steamgames.com
- Click Users & Permissions in the top menu
- Click Manage Groups
- Click your publisher/developer group name
- In the sidebar, click Web API Key
- If no key exists, click Create or Generate New Web API Key
- Copy the key — it starts with a long hex string
Note: You need "View Financial Info" permission in your Steamworks group to access this key. If you don't see the Web API Key option, ask your group admin for access.
Get notified in your Discord server when someone buys your game, leaves a review, or when your game hits a milestone. Plus, access a specialized Discord-themed dashboard!
To receive alerts and daily summaries in Discord, you'll need a webhook.
- Right-click the Discord channel you want notifications in and select Edit Channel.
- Go to Integrations > Webhooks and click New Webhook.
- Give it a name (e.g., "Steam Alerts") and copy the Webhook URL.
- You can create separate webhooks for alerts and daily announcements, or use the same URL for both.
- Open your Steam Dashboard settings (
http://localhost:8081/settings). - Paste your Webhook URLs into the Discord Notifications section.
- To enable the
/discorddashboard view, set up a Dashboard Auth username and password.
Once configured, the background monitor will automatically push events to your Discord server.
To view the Discord-styled mini dashboard, simply visit <your-server-url>/discord and log in with your configured credentials!
| Discord Dashboard | Announcements | Alerts |
|---|---|---|
![]() |
![]() |
![]() |
- Real-time sale alerts and review notifications
- Daily sales and revenue summaries
- Player count spike and wishlist milestone alerts
- A sleek, Discord-styled dashboard view
Get notified on your phone when someone buys your game.
- Open Telegram and message @BotFather
- Send
/newbot - Choose a name (e.g., "My Steam Dashboard")
- Choose a username (e.g.,
my_steam_dash_bot) - BotFather will give you a bot token — looks like:
8425733605:AAH_n6tiXo_-fn4TKhdr7jTYVA6vnVn390o - Copy and save it
- Message @userinfobot on Telegram
- It will reply with your chat ID — a number like
7271353545 - To add multiple recipients, get each person's chat ID
- Open your bot in Telegram (search by the username you chose)
- Press Start — this is required or the bot can't message you
- Enter the bot token and chat ID(s) in the setup wizard
- New sale alert with country breakdown
- New review notification
- Player count spike alert (50%+ increase)
- Wishlist change notification (5+ change)
A $5/month VPS is more than enough.
# Copy to your server
scp dashboard.py user@server:~/
ssh user@server
# Quick test
python3 dashboard.py
# Run in background
nohup python3 dashboard.py &Create /etc/systemd/system/steam-dashboard.service:
[Unit]
Description=Steam Dashboard
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/ubuntu/dashboard.py
WorkingDirectory=/home/ubuntu
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetThen:
sudo systemctl enable steam-dashboard
sudo systemctl start steam-dashboardYour dashboard is now at http://your-server-ip:8081.
This dashboard has no built-in authentication. If you're deploying to a public server, put it behind a reverse proxy with basic auth:
location / {
auth_basic "Steam Dashboard";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:8081;
}Or restrict access by IP using your firewall.
| Feature | Steam Dashboard | Steamboard | Steamworks Extras |
|---|---|---|---|
| Self-hosted | Yes | Yes | N/A |
| Zero dependencies | Yes | No (Electron) | No (Chrome) |
| Telegram alerts | Yes | No | No |
| Multi-game | Yes | No | No |
| Mobile-friendly | Yes | No | No |
| Web setup wizard | Yes | No | N/A |
Everything is configured through the web UI. There are no config files to edit.
For advanced users: all settings are stored in a local SQLite database (steam_dashboard.db) created on first run. You can back it up, move it to another server, or inspect it with any SQLite client.
- Python 3.8+ — standard library only, no external packages
- SQLite — embedded database, zero setup
- Chart.js — charts and trend visualization (loaded from CDN)
- Google Fonts — typography (loaded from CDN)
Issues and pull requests are welcome. The goal is to keep this simple — one file, zero dependencies.
Before submitting a PR:
- Make sure it still runs on Python 3.8+
- Don't add external dependencies
- Test the setup wizard flow end-to-end
MIT






