Methodology

ToGradeOrNot estimates the expected value of grading a card. Here is exactly how — so you can check our work, and see where we refuse to guess.

The EV formula

Every card gets a probability-weighted expected value over five outcomes — PSA 10, 9, 8, below 8, and a no-grade return (altered, counterfeit, or minimum-size, where the fee is still paid and the card comes back unencapsulated). The five probabilities always sum to one.

EV = Σ  P(grade) × [ net_proceeds(grade) − grading_fee(tier, grade) ]
        grade ∈ { 10, 9, 8, <8, no-grade }
     − cost_basis
     − shipping_share

net_proceeds(grade) = price(grade) × (1 − selling_fee_rate) − per_order_fee
cost_basis          = raw market price            (buy-to-grade)
                    = net raw-sale proceeds forgone (grade-what-you-own)
shipping_share      = round-trip shipping + insurance ÷ batch size

Grade probabilities start from the PSA population mix, shrunk toward era and type priors, and stamped with the model version. Prices carry uncertainty (wider when comps are thin or stale); we propagate it to a distribution and report an EV lower bound and a median EV as a band. A card is admitted to the Sheet only when its probability of a single profitable submission clears a fixed threshold and its EV lower bound is above zero — so a precise but lottery-ticket card does not top the list.

Fees and shipping are your editable constants (with shipped defaults: eBay 13.25% + $0.40/order and a default round-trip shipping split), not our data — so you can reproduce the math with your own costs.

Data sources

Prices & population via PokemonPriceTracker; population data by GemRate. Grading fees, turnaround, and tier state are tracked as first-class, freshness- stamped data — a stale fee poisons every EV, so we treat it like one. Card metadata is factual reference data. We display prices and derived estimates; we never expose a raw-data export or feed.

What we enforce in code

These are not promises — they are checks the engine runs, with tests, before any number reaches you.

No estimate without complete inputs
A card needs a raw price, PSA 9 and PSA 10 prices, a population report, and a live fee before any EV renders. Missing one? The card is refused with the specific gap named — never filled with a guess.
Modeled numbers are whole dollars
When a price is modeled rather than observed, we round to whole dollars. False cent-precision on a number we estimated is forbidden.
The grade ladder must hold
If a PSA 10 price comes back below a PSA 9, the row is an artifact — we suppress it rather than print a broken ladder.
Graders are never blended
PSA, CGC, and TAG are shown as separate rows. We never average graders into one misleading number.
Every probability carries its calibration status
Model estimates show from day one, labeled uncalibrated while the log is building. The “calibrated” badge unlocks only after enough verified outcomes AND passing an absolute calibration test — sample size makes calibration measurable, it does not prove it.
Every number carries source and freshness
Each price and population count is stamped with where it came from and how old it is. Past the staleness threshold, the EV for that card is suspended — loudly, not silently.
The downside is shown at equal weight
The “comes back a 9” profit-and-loss renders exactly as large as the upside. Never smaller, grayer, or hidden behind a tap.
Evidence surfaces are ad-free and affiliate-free
No ads, no affiliate links, ever, on any surface where we show you the evidence.

What we do not claim

An EV assumes a submission-grade copy — one in the same condition class as the population that historically got submitted. Your specific copy’s odds still need a photo check. Estimates are a screen, not a guarantee, and no result is ever a promise of a grade or a price.