Reference
Methodology
CS Terminal turns raw marketplace sales into one continuous daily series per item, and into the numbers an investor would ask for. This page follows the data in three steps: where it comes from, how we process it, and how we present it. Every method and the reasoning behind it is here; a few finely tuned thresholds are described in general terms.
1 Where the data comes from
The sources, and how a raw daily price is formed.
Steam Community Market, the base
More than 90 % of everything you see is a Steam sale. Steam publishes the sales of every listing hour by hour; from those hourly points we build one value per completed UTC day: the average of the hourly median prices, and the sum of the purchases. Prices are in USD, as traded on Steam’s US dollar market, always with two decimals; we do not convert from other Steam regions and do not apply Steam’s transaction fee. Nothing on that market can cost less than $0.03, so any daily value Steam’s history reports below it is lifted to $0.03. The running day is never shown, so the newest point on any chart is always yesterday (the “Last data point”). The history starts in August 2013 with the first CS:GO Weapon Case, and every tracked item carries its complete series from its own release.
The Steam price cap and third party prices
Steam does not allow sales above $1,800. For a knife worth $3,000 the Steam history is therefore not a price history at all: the few sales that happen sit at the cap, or below it for low float bargains, and say nothing about what the item is worth. We treat Steam sales at or just under the cap as “at the cap”: they count as neither price nor liquidity.
For those items CS Terminal switches the series to CSFloat, the largest third party marketplace, whose daily average sale price and sale count we track from January 2022. An item moves to CSFloat when three things hold together: its CSFloat price (converted to Steam level, see the factor) has risen near the cap; it has a dependable recent run of CSFloat sales; and Steam is no longer where it really trades, either because real Steam sales have dried up, or because CSFloat clearly dominates its trading over the past year.
The seam is the day from which the series is CSFloat. It is placed where the two series meet, so the line does not jump: the earlier of the day after the last real Steam sale and the first day the CSFloat price settled near the cap. An item switches back to Steam only when it trades below the cap again and shows sustained real Steam sales; a single stray sale never flips a series.
Each item has exactly one series and each point carries its source. There is no day by day mixing of marketplaces. Items that trade nowhere, not on Steam and not on CSFloat, show “No trade history” rather than an invented price. Buff is not used as a price source: we read it only as a cross check on CSFloat and as a fallback for an item that has CSFloat listings but no CSFloat sales.
2 How the data is prepared and processed
The whole chain, from the raw import to the number on the screen.
It starts with the raw imported prices. They are written to the database untouched and never overwritten, then flagged: by source (Steam, CSFloat or Buff) and by anything unusual, such as an outlier.
From that raw daily layer, a chain of scripts builds everything on top: monthly, quarterly and annual prices, and all the metrics. Each step decides for itself whether to keep or ignore a flagged point, depending on what gives the more sensible result, so the same raw data is prepared a little differently for different jobs. That is a deliberate choice, and it has visible effects: a chart can show a spike in the daily prices that no longer appears in the monthly view, or the ATH marker can sit just below a real trade. Both are on purpose, not a bug.
Every import is checked before it is stored
Every day’s import passes a gate before it is written. We check the provider’s health, the error rate of the fetch, how many already written days would change, mass jumps across the market, and, most importantly, a direct comparison of the provider’s data against our own independent fetch of a control basket of items (skins, knives, cases, stickers, charms, agents). If anything disagrees, nothing is written and the day is retried.
Converting CSFloat to Steam level: the factor 1.30
A dollar on CSFloat is not a dollar on Steam: Steam wallet funds cannot leave Steam, so the same item sells for more there. CS Terminal uses a fixed, openly shown factor of 1.30 to convert between the two, measured against items that trade on both markets and reviewed quarterly. It is deliberately one number for all items rather than a per item calibration: transparent, reproducible, and wrong in the same known way everywhere. This conversion feeds the Basis switch, and every metric on the site is computed on the SCM basis.
Outliers
Marketplaces produce bad prints: a craft with expensive stickers, a sale at a mistyped price, a $186 sale of a $1,500 knife. CS Terminal marks outliers and excludes them from metrics; it never replaces them. The raw value stays in the data and is shown, marked, in the Price Data tab. A daily value from any marketplace is flagged when it lands far from the item’s recent level on a day with next to no volume, so a real market move is never flagged. Steam and third party sales each have their own fixed margin, and a handful of recent sale days are needed to judge. A flag is lifted again if the following sales confirm the new level. Monthly values are held against the surrounding months by the same idea, and quarterly and annual values inherit any flag. ATH, ATL, returns and everything derived from them ignore flagged points.
All time high, all time low and the last price
The all time high and all time low of a listing are taken from a short rolling median of several trading days, not a single print. A single unusual sale therefore never becomes the all time high, and the ATH line in the chart can sit a little below the highest visible spike, by design. The current price in the header is the last real trade, unsmoothed.
Returns and growth
Entry. All growth figures are measured from an entry point to the latest daily price. Every case and skin page offers three entry bases, switched in the bar below the header:
- +1Y (default): the first trading day one year after the case’s release, priced on a short median window. The launch year is the most volatile and least representative stretch of an item’s life; measuring from +1Y skips it.
- REL: the first trading day after release, at the actual launch price. What you would have paid on day one, hype included.
- ATL: the listing’s all time low, on the same median basis as the ATH and ATL figures.
Rare items such as knives and gloves can go weeks or months without a sale. If nothing traded on the release day or on the +1Y date, the entry is the first recorded trade after it, and the page labels it that way (“First recorded trade”, “First trade after +1Y”).
A CAGR is shown only once at least one year has passed since the entry. Younger entries show the multiple but no annualized rate, and the page says from when a CAGR becomes possible.
CAGR = (current ÷ entry)^(1 ÷ years) − 1, with the end point always the latest daily price and the horizon counted in days. Multiple = current ÷ entry. Short horizon returns (7D to 1Y) and the long ones (3Y, 5Y, 10Y) are computed on daily data, each end anchored on a short median window rather than a single day, so a spike on the anchor day does not distort the return. An item too young for a horizon shows no value rather than a misleading one.
Aggregates are equal weighted. A case CAGR averages its skins, each skin first averages its wear grades, so a skin with five wears weighs no more than one with two. Normal skins only; StatTrak™, knives and gloves are shown separately. “Best wear CAGR” means exactly that: the best of the wear grades, not the skin average.
Volatility is the annualized standard deviation of monthly returns (× √12). Risk adjusted return is CAGR ÷ volatility, a Sharpe ratio without a risk free rate. The trend signal combines the 50 day and 200 day moving average regime with the price against its 50 day average; it describes, it does not predict.
Liquidity
Liquidity is the average number of sales per day over the last twelve months for the exact listing (for a skin, summed over its wears). Tiers: High ≥ 50, Medium ≥ 10, Low ≥ 1, Thin < 1 sale per day. Below about one sale a day a market is slow and expensive to exit, and prices in that region deserve less trust than the chart suggests.
Update cadence
Prices are imported twice a day, in the early morning and the evening (UTC); yesterday is final after the evening run. Prices, ATH and ATL and all entry based figures update with every import; monthly, quarterly and annual values and the slower metrics are rebuilt on a monthly cycle. Every day, a control fetch checks a fixed basket of items against Steam directly.
3 How the data is presented
How the processed data appears on the site.
The Basis switch
The Basis switch in the top bar applies site wide to every money value:
- SCM (default): everything on Steam level; CSFloat sales × 1.30.
- CSFloat: everything on CSFloat level; Steam sales ÷ 1.30.
- Original: every price as it was actually traded, with its source tagged.
Charts
Charts hide days flagged as outliers by default, so a single bad print does not stretch the scale. When the visible window contains any, the line under the chart says how many are hidden and offers to show them; the Price Data tab always lists them, marked. The standard windows end on the latest data day, and the return in the chart header is the same figure shown elsewhere on the page: a marker at the left edge shows the price that return is measured from. The Entry button opens the window at the selected entry point.
The CSFloat section of a line is drawn dashed in the same colour, with the seam marked “SCM → CSFloat”. In the volume bars, the CSFloat section is drawn lighter, because sales counts on Steam and CSFloat are not directly comparable.
The Price Data tab
The Price Data tab lists every value with its source tag (SCM, CSF or BUFF) and marks outliers in place, so the raw number is always visible. Monthly rows also show whether a value falls on the exact first trading day of the month or the nearest day within a few days (“exact date” vs “nearby date”).
What is tracked, and what is not yet
Every case with full onboarding, every skin design in it, every individual listing (wear × edition) and the containers themselves, each with its complete daily history. Collections, souvenir packages, stickers, agents and charms follow. Prices are what they are on the day; we do not model float, pattern or sticker premiums, and a craft that sells far above its plain price is treated as an outlier, not as a signal.
Not financial advice. Everything on CS Terminal is descriptive. Past growth is not a forecast, skins are not a regulated asset, and the site has no view on what you should buy or sell.
Glossary
The metric definitions used across the terminal. Tap to expand.
Entry basis+
All return figures are measured from an entry point to the latest daily price. +1Y (default) is the first trading day one year after release, priced as a 5 day median; it skips the volatile launch phase. REL uses the first trading day after release at the actual launch price, ATL each item’s all time low (also a 5 day median). A CAGR appears once at least one year has passed since entry; younger entries show the multiple only. Rare items that did not trade on the release day or the +1Y date start at the first recorded trade after it; the page labels that.
Case CAGR+
Annualized growth rate of the case container from the selected entry (default: one year after release) to the latest daily price. CAGR = (current / entry)^(1 / years) − 1. Shown once at least one year has passed since entry.
Avg. Skin CAGR+
Equal weighted average across all skins. Each skin’s wear variants are first averaged into one CAGR, then every skin counts equally: a skin with 5 wears weighs no more than one with 2. Normal skins only (no StatTrak™ or Souvenir, no knives or gloves).
Median Skin CAGR+
The middle skin CAGR (50th percentile), on the same per skin basis as the average. More robust to single outliers than the mean.
Best Skin+
The skin with the highest per skin CAGR in the collection (wears averaged, normal skins only).
Multiple+
How many times the entry price the item is worth today. Multiple = current / entry. 2× means the price doubled.
Win Rate+
Share of skins trading above their entry price, counted per skin, not per wear variant. Follows the selected entry basis (default: one year after release).
ATH+
All time high on daily prices, taken from a short rolling median of several trading days, so a single unusual sale never becomes the ATH. Days flagged as outliers are left out; they stay visible, marked, in the Price Data tab.
Discount from ATH+
How far the current daily price sits below the item’s all time high. A skin row follows its most discounted wear (hover names it; expand the row for all wears). Read it together with the position in range: a big discount near the all time low means the price is historically depressed, while the same discount mid range means the ATH was a spike.
Volatility+
Annualized variability of monthly returns (standard deviation × √12). Higher means larger price swings. A risk measure, not good or bad on its own.
Risk adjusted return+
CAGR divided by volatility: the return earned per unit of risk. Higher is better. A simplified Sharpe ratio without a risk free rate.
Trend signal+
Combines the 50d/200d moving average regime with the current price against its 50d average; the matrix above the table maps all four states. For a skin, the signal follows its most liquid wear grade, the market you would actually trade. Descriptive information, not a recommendation.
Liquidity+
Average number of sales per day over the last 12 months, for this exact wear variant. Below about 1 sale per day the market is thin: slow and costly to exit.
Liquidity tier+
Ranks average daily sales: High ≥ 50, Medium ≥ 10, Low ≥ 1, Thin < 1 per day. For a skin, the tier reflects its most liquid wear grade; Thin means no wear reaches 1 sale per day. A thin market is slow and costly to exit.
Monthly sales+
Average number of sales per month: the 12 month average daily volume × 30. For a skin, volumes are summed across its wear grades.