How the Play Score is Calculated
The 0-100 composite score that ranks every grading opportunity on Cardboard Assets. Full formula breakdown — net profit, ROI, depth, pop velocity, liquidity — with worked example.
The /plays/ index ranks the platform's grading-flip opportunities by play score — a 0-100 composite that combines net profit, ROI, data depth, pop velocity, and liquidity. This page documents the formula end-to-end. No black-box weights, no proprietary magic — every component is explicit and verifiable.
The formula
The composite, defined in factory/scripts/compute_plays.py:
play_score = profit_score + roi_score + depth_score + pop_score + liquidity_score
Maximum 100. Component caps:
| Component | Max | Formula |
|---|---|---|
| Profit score | 40 | min(40, 40 × log10(max(1, net_profit)) / log10(1000)) |
| ROI score | 25 | min(25, 25 × roi_pct) |
| Depth score | 15 | min(15, 15 × sample_size_90d / 30) |
| Pop score | ~10 | Varies by pop velocity (see component breakdown) |
| Liquidity score | ~10 | Varies by raw price band (see component breakdown) |
Component breakdown
Profit score (40 points)
Logarithmic — diminishing returns above $1,000 net profit. A $50 net gets 18 points; a $500 net gets 36 points; a $5,000 net gets the full 40. The log scaling prevents a single $100K Charizard flip from drowning out a basket of $200 flips.
ROI score (25 points)
Linear up to 100% ROI. A 25% ROI flip gets 6 points; 50% ROI gets 12.5; 100%+ caps at 25. Rewards small-cost-base flips with proportional upside.
Depth score (15 points)
Sample size in the last 90 days. A card with 30+ sales gets the full 15; 15 sales gets 7.5; 5 sales (minimum for eligibility) gets 2.5. Rewards cards where the comp prices are statistically meaningful, not derived from 3-data-point series.
Pop score
Pop velocity = how fast the PSA 10 population is growing. A card with falling pop-velocity (graders running out of clean copies) earns more score; a card with accelerating pop-velocity (everyone grading at once) earns less. Caps at ~10 points.
Liquidity score
Cards in the $50-$1,000 raw band trade fastest — buyers exist at every price point. Sub-$30 cards have higher friction (eBay fees eat margin); $5K+ cards have thin buyer pools. The score rewards the liquid middle.
Eligibility filter
A card appears on /plays/ only when:
net_profit ≥ $50roi_pct ≥ 0.30(30%)sample_size_90d ≥ 5pop_velocity_30d_pct ≤ 0.75ORNULL
Cards that fail eligibility might still appear in the optimizer with a verdict but won't surface as a play. The threshold isn't "is this a flip" — it's "is this a flip I'd recommend you actually execute given current data quality."
Worked example
Sheoldred, the Apocalypse (Dominaria United #290 normal):
- Net profit: $111 → profit score = 40 × log10(111) / log10(1000) = 40 × 0.682 = 27.3
- ROI: 38% → roi score = 25 × 0.38 = 9.5
- Sample 90d: 22 → depth score = 15 × 22/30 = 11.0
- Pop velocity: 0.45 (stable) → pop score ≈ 6
- Raw $290 → liquidity score ≈ 8
play_score = 27.3 + 9.5 + 11.0 + 6 + 8 = ~62
Score 62 places it in WATCH-territory — solid but not GRADE-conviction. A card with $1,500 net + 80% ROI + 30 sample + falling pop + liquid raw price hits 80+ which the composite designates GRADE-conviction.
Frequently asked questions
- What is the play score?
- Play score is a 0-100 composite that ranks grading-flip opportunities on /plays/. It combines five inputs: net profit (40% weight), ROI (25%), comp depth (15%), pop-velocity (variable), and liquidity (variable). Higher scores mean stronger conviction, not just bigger profit.
- How is play score different from the GRADE/WATCH/SKIP verdict?
- The verdict is binary-ish — does the math support grading or not. The score is a continuous rank — among all GRADE-verdict cards, which ones have the strongest combination of size + return + data quality + tradeability. A $50K-net flip on a 1-month-old chase card with deep sample size beats a $50K-net flip on a vintage card with thin comp depth, even though net is identical.
- Why isn't net profit the only factor?
- Pure-profit rank gives you a list of vintage Charizards every time — the cards with the biggest dollar swing. But many of them have thin sample sizes (3-5 sales/year) and illiquid markets. Splitting out ROI rewards small-cost flips with proportional upside; depth rewards data quality; liquidity rewards faster-selling cards. The composite ranks flips by execution-realism, not just headline math.
- What is the eligibility filter?
- A card appears on /plays/ only if: net profit ≥ $50, ROI ≥ 30%, sample size in last 90 days ≥ 5, and pop velocity ≤ 75% (or null). This filters out cards where the math is technically positive but the data is too thin or the population is growing too fast to trust the slab premium.