Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

For persistent, trustworthy CS2 statistics, capture events on the server with Metamod:Source, CounterStrikeSharp and a maintained statistics plugin, then store raw events in MySQL and calculate aggregates such as K/D, ADR and win rate from documented denominators. Add Game State Integration (GSI) when you need a live dashboard or stream overlay. Use Valve’s Steamworks server-stat API only when its authentication and short write window fit your deployment.

Choose the collection method before installing anything

CS2 statistics can come from three different data paths. They are not interchangeable: one is authoritative server history, one is a low-latency broadcast feed, and one is a specialized Valve API with strict credentials and timing limits.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Approach Best use Authority and persistence Latency Credentials and effort Multi-server fit
Server plugin with CounterStrikeSharp Community-server history, leaderboards and complete match records Reads game events directly on the server; can persist every event and session Near real time Requires Metamod:Source, the matching CounterStrikeSharp runtime, plugin maintenance and a database if history is needed Strong; several servers can write to one database with a unique server identifier
Game State Integration (GSI) Live web panels, broadcast graphics and stream overlays HTTP POST snapshots from the game; gaps are possible if requests or the endpoint fail Low, suitable for live presentation Requires an HTTP endpoint and GSI configuration; no Steam Web API key Good, provided each server identifies itself and the consumer separates feeds
Steamworks GetGameServerPlayerStatsForGame Deployments that already use Valve’s server-stat workflow Valve’s service accepts writes for users currently playing and only a short grace period after departure Depends on when you call it Requires a publisher Web API key, game/app IDs, a date range and a secure server Possible, but each server must be authenticated and scheduled correctly

A practical design uses the server plugin as the source of record, MySQL for shared history, and GSI as a presentation layer. Do not make a GSI feed your only historical archive: dropped requests, endpoint downtime, reconnects and payloads that omit a section can leave permanent gaps.

What you need on the CS2 server

  • A current CS2 dedicated server and a backup of its configuration and database settings.
  • Metamod:Source installed in the CS2 game directory.
  • The CounterStrikeSharp runtime that matches the current server and runtime requirements. CounterStrikeSharp is a server-side modding framework for Counter-Strike 2 and exposes event handlers, listeners, timers and player schema access.
  • A maintained statistics plugin that supports the current CounterStrikeSharp API and the events your metrics require.
  • A database server, commonly MySQL, if statistics must survive restarts or be shared by several servers.
  • An HTTP endpoint if you intend to consume GSI data for a dashboard or stream.

Keep the database and HTTP consumer on infrastructure that the game server can reach reliably. The game server should be able to continue a match if the dashboard or database is temporarily unavailable; queue or retry writes rather than blocking gameplay.

#1 Best Overall
Sale
Sceptre New 22-Inch Gaming Monitor, FHD 1080p, Up to 144Hz, HDMI, DisplayPort, Built-in Speakers, Machine Black (E225W-FW144 Series, 2026)
  • 【INTEGRATED SPEAKERS】Whether you're at work or in the midst of an intense gaming session, our built-in speakers provide rich and seamless audio, all while keeping your desk clutter-free.
  • 【EASY ON THE EYES】 Protect your eyes and enhance your comfort with Blue-Light Shift technology. This feature reduces harmful blue light emissions from your screen, helping to alleviate eye strain during long hours of use and promoting healthier viewing habits.
  • 【WIDEN YOUR PERSPECTIVE】Our sleek minimal bezel design ensures undivided attention. The nearly bezel-free display seamlessly connects in a dual monitor arrangement, delivering an unobstructed view that lets you focus on more at once, completely distraction-free.

Install Metamod:Source, CounterStrikeSharp and a statistics plugin

  1. Back up the server. Stop the dedicated server, copy its configuration, and record the current game build and installed extensions. A rollback is much easier when the original game/csgo directory and configuration are preserved.
  2. Install Metamod:Source. Copy its supplied addons directory into the CS2 game directory, following the release’s directory layout. Start the server and run meta list from the server console. Metamod should report itself and its loaded modules instead of an unknown-command error.
  3. Install the matching CounterStrikeSharp runtime. Copy the runtime’s addons directory into the same CS2 game directory. Restart and inspect the console for the CounterStrikeSharp core plugin. If the core does not load, do not install a statistics plugin yet; fix the runtime or version mismatch first.
  4. Install the statistics plugin. Place the plugin files under game/csgo/addons/counterstrikesharp/plugins. Use a maintained release that explicitly supports the current game and CounterStrikeSharp versions. Do not assume a plugin written for an older CS:GO or CS2 build will still receive the same events.
  5. Configure identity and storage. Give the server a unique name or ID, then set the database host, port, database name, user and password in the plugin’s server-side configuration. Never put these values in files served to players or in a web client.
  6. Restart and verify loading. Read the startup log for Metamod, CounterStrikeSharp and the statistics plugin. A successful load message is necessary but not sufficient; the next check is an actual controlled round.
  7. Run a controlled test. Join with two test accounts, play a short round that includes a kill, damage, a headshot and a team change, then disconnect and reconnect one account. Check that the expected event and session rows appear and that a reconnect does not create a second overlapping session.
  8. Add presentation only after capture is stable. Connect a dashboard, API or overlay after raw event writes and reconnect handling have been verified. This isolates display bugs from collection bugs.

Capture immutable events before calculating statistics

CounterStrikeSharp’s event and listener model supports a durable event pipeline. Subscribe to client connect and disconnect listeners, map-start hooks, timers and game events such as player_death. A useful collector also records damage, round, team, weapon, objective and bomb events. Write the facts that happened first; calculate rates later.

Recommended event fields

  • Identity: Steam ID as the stable key and a separate display-name history. Names change; the Steam ID should not.
  • Scope: server ID, map ID, match ID, round ID and session ID.
  • Player state: team, connection time, disconnection time, bot flag and whether the player was active for the round.
  • Combat: kills, deaths, assists, damage amount, weapon, headshot flag and attacker/victim IDs where available.
  • Objectives: bomb plant, defuse, pickup, hostage or other mode-specific events.
  • Validity flags: warmup, competitive/official round, abandoned round and any administrator-defined exclusion.
  • Ingestion metadata: event timestamp, server build, plugin version and a deterministic event or idempotency key.

Use append-only event rows wherever possible. If a retry sends the same event twice, an idempotency key or unique constraint should make the second write harmless. Corrections can be represented as new records or a controlled reprocessing job instead of silently overwriting the original observation.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Design a MySQL schema that can serve one or many servers

A single-server experiment can begin with one statistics table, but a shared leaderboard needs explicit boundaries. Keep these logical entities separate:

Table or entity Purpose Important columns
players Stable identity Steam ID, first-seen and last-seen timestamps
player_names Display-name history Steam ID, name, valid-from and valid-to timestamps
servers Distinguishes installations Unique server ID, human-readable name, region and build metadata
matches and maps Groups rounds and records map boundaries Server ID, map, start/end time, mode and completion status
rounds Defines denominators Match ID, round number, winning team, warmup flag and completion status
sessions Measures playtime Player ID, server ID, connect time, disconnect time and close reason
events Immutable source facts Event key, type, timestamp, player IDs, weapon, damage and raw payload
player_round_stats Optional pre-aggregated facts Player, round, kills, deaths, assists, damage, headshots and participation flag
player_aggregates Dashboard-friendly totals Time window, filters, kills, deaths, ADR, headshot percentage and wins

Index event time, server ID, match ID, round ID and Steam ID. Put a unique constraint on the event key and on the natural player-round combination used for pre-aggregates. For multiple servers, include server ID in every match, session and aggregate key; otherwise two servers can merge rounds that happen to have the same number.

Keep credentials and writes server-side

The plugin should connect to MySQL with a user limited to the required database and tables. Store the password in a server-only configuration or secret store, restrict database network access to the game and application hosts, and redact connection strings from logs. A web dashboard should read from a narrow API or read-only database account rather than receiving the write credential.

Rank #2
Sale
LG 24G411A-B 24-inch Ultragear Full HD (1920 x 1080) IPS Gaming Monitor, 144Hz (O/C), 1ms MBR, NVIDIA G-Sync Compatible, AMD FreeSync, HDR10, HDMI, DisplayPort, Slim Stand, Black
  • Vivid Color, Fast Response, Total Control - The 24" UltraGear FHD gaming monitor delivers vivid HDR10 color, ultra-smooth 120Hz speed, and 1ms MBR clarity. G-SYNC compatibility & FreeSync keep gameplay tear-free. The sleek, slim design keep you focused and in control.
  • Vivid Color That Puts You in the Action - Step onto the battlefield with HDR10 visuals and up to 99% sRGB color gamut coverage. The IPS display delivers rich, vivid tones, so every explosion, shadow, and landscape appears exactly as the developers intended.
  • 120Hz Native Speed (144Hz Overclock) - Enjoy fluid, crystal-clear gameplay with a 120Hz native refresh rate, boosted to 144Hz when overclocked. Minimized motion blur keeps every frame sharp, so you can stay locked in on the action.
  • 1ms MBR: Fast-Paced Speed to Victory - 1ms Motion Blur Reduction (MBR) keeps gameplay smooth and sharp, cutting blur and ghosting so fast-moving action stays clear—helping you stay competitive when every millisecond counts.
  • NVIDIA G-SYNC Compatible & AMD FreeSync - NVIDIA G-SYNC Compatible and AMD FreeSync deliver smooth, tear-free, low-latency gaming with high refresh rates—so every frame stays sharp.

Define K/D, ADR, headshots, win rate and playtime precisely

A label is not a definition. Publish the numerator, denominator and filters with every statistic so two dashboards cannot report different values under the same name.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Metric Definition Decisions to document
K/D Kills divided by deaths Choose and publish a zero-death rule, such as displaying “—” until a death occurs or reporting kills as an unbounded value. Do not silently divide by one.
ADR Total damage divided by rounds played State whether only completed competitive rounds count, how forfeited rounds are handled and whether warmup, spectators and bots are excluded.
Headshot percentage Headshot kills divided by total kills Define whether assisted kills are excluded from the kill denominator and what appears when kills equal zero.
Win rate Rounds won divided by completed rounds, or matches won divided by completed matches Choose rounds or matches; do not mix the two in one field. State how ties, abandons and team changes are treated.
Playtime Active session duration after reconnect and disconnect reconciliation Close open sessions at a controlled shutdown or timeout, prevent overlapping sessions, and state whether spectator time counts.

Calculate these values in scheduled queries or database views from the raw rows. Reprocessing is then possible when a filter changes, a plugin bug is corrected or a round is reclassified from warmup to competitive.

Use Game State Integration for live dashboards and stream overlays

CS2 GSI sends HTTP POST JSON to an endpoint selected in a GSI configuration file. Payload sections can include map, round, player_id, player_match_stats, player_state, player_weapons, allplayers_* , bomb and phase countdowns. A consumer can update a web panel or browser-based broadcast overlay as the match changes.

Configure the feed

  1. Create a server-side HTTP endpoint that accepts POST requests and authenticates the source. Use a private address for local overlays or TLS and an access token when the endpoint is reachable over a network.
  2. Write a GSI configuration that names the endpoint, sets an appropriate request timeout and asks only for the sections the overlay needs. A minimal illustrative shape is:
{
  "uri": "http://127.0.0.1:8080/cs2/gsi",
  "timeout": "5.0",
  "buffer": "0.1",
  "data": {
    "map": "1",
    "round": "1",
    "player_id": "1",
    "player_match_stats": "1",
    "player_state": "1",
    "player_weapons": "1",
    "allplayers_id": "1",
    "allplayers_state": "1",
    "bomb": "1"
  }
}

The exact file location and authentication options depend on the GSI consumer and server setup. Treat the JSON above as a starting shape, then validate it against the consumer you operate. Do not expose an unauthenticated public endpoint.

  1. Have the endpoint validate JSON, timestamp the receipt, and return a fast success response. Process the payload asynchronously so a slow database query does not cause the game to abandon delivery.
  2. Normalize each payload with server ID, match ID and receipt time. Store the latest state for a live overlay; persist payloads or derived snapshots only if you need replay or post-match reconstruction.
  3. Display a connection-health indicator. If no payload arrives within the expected interval, show “data delayed” rather than freezing the last score and presenting it as current.

GSI is excellent for presentation latency, but it is not a complete event ledger. A dropped request can omit a kill or state transition, and reconnects can restart the feed with incomplete context. Pair it with server-side event capture when historical accuracy matters.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
Sale
msi PRO MP243L E14 24-inch IPS 1920 x 1080 (FHD) Gaming Office Monitor, 144Hz, Free-Synch, HDR Ready, HDMI, VGA Port,VESA Mountable, Tilt, 4-Side Slim Bezel,1ms, Black
  • MSI's 23.8-inch Full HD IPS gaming monitor (1920×1080) delivers a 1500:1 contrast ratio with wide 178°/178° viewing angles — producing deeper blacks, brighter highlights, and accurate colors from virtually any position for gaming and productivity.
  • TÜV Rheinland certified Flicker Free and Low Blue Light — eliminating the ~200Hz screen flicker common on standard monitors and reducing harmful blue light exposure to minimize eye strain during extended gaming or work sessions.
  • 144Hz high refresh rate delivers ultra-smooth motion and sharper tracking versus standard 60Hz or 75Hz monitors — keeping every frame fluid and responsive for fast-paced FPS, racing, and action games without screen tearing or stuttering.
  • MSI's built-in Eye-Q Check provides a vision assessment tool to help optimize display settings for healthier long-term viewing — designed for professionals and students spending extended hours in front of a Full HD IPS screen.
  • Tilt-adjustable stand (-5°~20°) for comfortable viewing at any desk setup, with VESA 100×100mm wall mount compatibility for monitor arms, brackets, and multi-monitor arrangements — reducing neck strain during long gaming or work sessions.

When the Steamworks server-stat API is appropriate

Valve documents GetGameServerPlayerStatsForGame for deployments that use the Steamworks server-stat system. The request requires a publisher Web API key, game and app IDs, and a date range. Valve states that the call must be made from a secure server and can never be used directly by clients.

The method’s timing constraint is important: writes are limited to users currently playing, with only a short grace period after they leave. A job that waits until a match or round ends can miss players who disconnected earlier. Continuous or frequent capture is safer, with retries and a local queue for transient API failures. Keep the key out of client code, browser requests, crash dumps and ordinary logs.

This route is specialized rather than a replacement for a plugin event ledger. Confirm that your publisher access, app identifiers, permitted statistic names and retention requirements match the API before building your entire data model around it.

Build a reliable ingestion and aggregation pipeline

Separate collection from calculation

The collector should do little more than validate the event, attach identifiers, and write it durably. A scheduled worker can then roll events into per-round and per-player aggregates. This prevents an expensive leaderboard query from running inside a kill event handler and makes it possible to recalculate after a definition changes.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Handle reconnects and disconnects

On connect, create a session only if no open session exists for that Steam ID and server. On disconnect, close the matching session with a timestamp. If the process crashes, close stale sessions during the next startup using a documented timeout or the last observed heartbeat. Reconnect reconciliation must not add the entire disconnected interval to playtime.

Rank #4
Sceptre 24-Inch Gaming Monitor, 99% sRGB, 1ms, Up to 180Hz, FreeSync, Eye Care, FPS/RTS, DisplayPort, HDMI, Built-in Speakers, Machine Black (E248B-FPT168 Series)
  • up to 180Hz Refresh Rate: Pushing beyond the standard 144Hz, 165Hz gives gamers an edge in visibility as frames transition instantly, leaving behind no blurred images.
  • IPS Panel: The IPS (In-Plane Switching) panel cannot be beat when it comes to consistently delivering top color performance and sharp visibility from multiple viewing angles.
  • AMD FreeSync: With FreeSync, gamers now enjoy smooth video and seamless on the spot movement through their fast paced games. FreeSync is an AMD technology that nearly eliminates tearing and stuttering due to differences between a graphics card's frame rate and a monitor's refresh rate.
  • Edgeless Design: Edgeless Design completely immerses you in all the captivating action and wondrous scenery that 1080P resolution and 165Hz refresh rate have to offer.
  • Multiple Digital Ports: While three HDMI ports each deliver an impressive 144Hz refresh rate, one DisplayPort produces a stunning 165Hz refresh rate, all in FHD resolution.

Exclude invalid samples consistently

Mark warmup, bot, spectator and abandoned-round records instead of deleting them. Queries can then apply the same filters to K/D, ADR and win rate. This is safer than changing the meaning of historical rows when an administrator changes a server setting.

Make retries idempotent

Assign an event key derived from the server, match, round, event type and source sequence where available. Insert with a uniqueness check, or upsert only the fields that are safe to update. A retry should never double a kill, damage total or round win.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Keep the system working after CS2 updates

Game updates can change schemas, event names or extension compatibility. SourceMod’s statistics page records that CS:GO servers became unavailable to its query inclusion after an engine change, illustrating why a previously working statistics stack can break at the engine boundary. Pin known-good versions of Metamod:Source, CounterStrikeSharp and the statistics plugin; do not auto-update all components simultaneously.

  • Before updating, save the current binaries, plugin configuration and database schema version.
  • Test on a staging server with a controlled round and verify connection, death, damage, round and map events.
  • After updating, inspect startup logs and run meta list before allowing public players in.
  • Watch for missing event rows, null player IDs, duplicate sessions and sudden changes in round counts.
  • Keep a rollback copy and document which component was changed when an error appears.

The SourceMod page captured on 2026-10-14 listed 8,966 servers and 27,245 players. That live figure is an ecosystem snapshot, not a compatibility guarantee for any particular plugin; maintenance status and current build support matter more than popularity alone.

Troubleshoot common failures

meta list does not work or Metamod is absent

Check that the addons directory was copied into the actual CS2 game directory, not the server root or a backup directory. Confirm the server build and restart fully. If the command still fails, resolve Metamod installation before troubleshooting CounterStrikeSharp.

Best Value
Sale
SANSUI 27 Inch Curved 160Hz Gaming Monitor 144Hz FHD 1080P Computer Monitor
  • 27" 1500R Up to 160Hz Curved Gaming Monitor FHD 1920x1080P 1Ms (MPRT) for Gaming, Movie, Working,support with 144Hz, 120Hz(depend on signal source device's hardware).
  • Gamer-Centric Features: Game Assistant (Black Level Adjustment(shadow booster), Crosshair, Timer, Counter) | Preset Modes (FPS/RTS/Racing/Office/Movie/SRGB).
  • Immersive & Clear Viewing: 1500R curvature reduces image distortion and eyestrain. 160Hz refresh rate, 1ms (MPRT) response time, FreeSync
  • Color Control: 4000:1 Contrast Ratio, 300 nits Brightness & 110% sRGB color coverage, Low Blue Light, Anti-Flicker/Anti-Glare, HDR Mode(can be enabled in the OSD menu only when connected via an HDMI port). If color not showing great on games, try to change color setting or just turn on the HDR mode.
  • Jacks: HDMI 2.0(160Hz max), DP 1.4(160Hz max), Audio Jack(No Speakers) | VESA 100x100mm | Tilt (-5°~15°±2°).

CounterStrikeSharp loads but the statistics plugin does not

Read the plugin log for dependency, .NET runtime or API-version errors. Confirm that the plugin is directly under game/csgo/addons/counterstrikesharp/plugins, that its files are readable by the server account, and that the release supports the installed CounterStrikeSharp runtime.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Rows exist, but K/D or ADR is zero

Inspect raw events first. Verify that attacker and victim Steam IDs are resolved, that the query excludes only intended warmup or bot rows, and that the round is marked completed. Check whether the aggregate job ran after the test round and whether a duplicate-prevention rule discarded legitimate events because its key was too broad.

Playtime is inflated after reconnects

Look for overlapping open sessions. Close the prior session at the disconnect timestamp, create a new session on reconnect, and run a repair query that caps impossible durations. Server restarts need a defined stale-session policy.

The overlay shows stale or missing data

Check the endpoint access log, response status and payload receipt time. A firewall, wrong bind address or slow handler can stop GSI delivery. Return a quick success response, process asynchronously, and show a delayed-data state when heartbeats stop. Do not fill missing events by guessing from the last snapshot.

Statistics changed after a game update

Compare event counts and field names before and after the update. Pin versions, consult the plugin’s compatibility notes, and disable the public leaderboard until a controlled round confirms that kills, deaths, damage and round completion are being captured again.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Security, privacy and operational safeguards

  • Keep Steam Web API keys and MySQL passwords on the secure server only; never send them to clients or embed them in an overlay page.
  • Use least-privilege database accounts and restrict inbound database connections by host or network.
  • Authenticate GSI requests and rate-limit the endpoint. Validate payload size and JSON types before processing.
  • Protect Steam IDs and name history as personal data. Publish only the fields your community needs and define retention for raw events.
  • Back up the database and test restoring it. A leaderboard that cannot be recovered is not persistent history.
  • Monitor ingestion lag, event error counts, open sessions, database failures and GSI heartbeat age.

A decision checklist

  • Choose a server plugin when authoritative history, K/D, ADR, playtime and cross-match leaderboards are the priority.
  • Add MySQL when data must survive restarts, feed a website, or combine several servers.
  • Add GSI when a stream or dashboard needs live map, round, player, weapon, bomb or countdown state.
  • Use Steamworks server stats only when you can protect the publisher key and capture players within the current-play and grace-period window.
  • Store raw events, define denominators, and exclude warmup, bots and abandoned rounds consistently before publishing any rate.
  • Test after every CS2, Metamod:Source, CounterStrikeSharp or plugin update.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.