Every number on VARIBLE is derived from on-chain reads. No partner APIs, no aggregator black boxes, no marketing-deck math. This page documents the formula behind every metric so you can audit our numbers.
We index 5 platforms directly against their canonical chains. Every metric on the site flows from one of these primitives:
Every index we publish belongs to one family: The Varible Index(nickname "the V"). Each is a constant-quality price index built from repeat sales — the same physical card sold in two different weeks, each pair's move spread over the weeks it spans and chained week to week, rebased to 100 at inception. It is a trend estimator: smoother than any single week, and a week resting on too few pairs is withheld rather than estimated. It replaced a set×grade stratified median that measured mix, not price. Each index carries a V-ticker derived from the entity's short code, so the scheme never drifts as the catalog grows. The whole market is V-MKT; each category and named IP has its own. The public API echoes each index's ticker, which makes this registry the canonical one.
V-MKTThe Varible Market IndexV-TCGThe Varible TCG IndexV-SPTThe Varible Sports IndexV-PKMThe Varible Pokémon IndexV-OPThe Varible One Piece IndexV-YGOThe Varible Yu-Gi-Oh! IndexV-MTGThe Varible Magic: The Gathering IndexV-DSNThe Varible Disney / Lorcana IndexV-DBZThe Varible Dragon Ball IndexV-VFRThe Varible VeeFriends IndexV-RFTThe Varible Riftbound (LoL) IndexV-AZKThe Varible Azuki TCG IndexV-MOONThe Varible Moonbirds IndexV-PPGThe Varible Pudgy Penguins IndexV-WAXThe Varible Sealed Wax IndexV-NBAThe Varible Basketball IndexV-MLBThe Varible Baseball IndexV-NFLThe Varible Football (NFL) IndexV-SOCThe Varible Soccer IndexV-NHLThe Varible Hockey IndexV-F1The Varible F1 / Racing IndexV-SNKThe Varible Sneakers IndexV-CMXThe Varible Comics IndexPer-token value is the cheapest active USD listing on the platform's order book. For Collector Crypt we use the Insured Valuetrait (PWCC vault appraisal) since most CC tokens aren't actively listed.
[$1, $5M] are dropped.— rather than a figure too small to mean anything. A cap is never gated on 24h trading: what changed hands today doesn't change what the float is worth.Sum of qualifying secondary-market sales in the last rolling 24h, read from each platform's own feed: native marketplace contracts for Beezie and Courtyard, and a USDC + NFT same-transaction heuristic against the Collector Crypt marketplace program. Phygitals' secondary market has no source yet, so its resale figures read — rather than zero.
Active 24h = the union of unique buyer + seller wallets (set union, not sum). Same wallet on both sides counts once.
For each platform with a primary-market mechanic we maintain a disk cache populated by npm run warm-primary-revenue:
primary_revenue = Σ ( USDC inflow into platform.gacha_receivers
from senders NOT in platform.internal_exclusions )
For CC: filter to canonical pull prices [$25, $50, $75, $80, $100, $151, $250, $1000, $2500, $5000]
For Phygitals/Courtyard: count every inbound USDC transfer.Internal exclusions are addresses we've identified as treasury / rarity-bucket / house wallets — transfers from them to a receiver represent internal moves, not user revenue.
Per-IP holders count = unique on-chain owners holding at least one card in that IP. Per-platform holders count = unique owners holding any card on that platform.
The cross-platform total is a strict union, not a sum: a wallet holding cards on both Beezie and Collector Crypt counts once. That is why the headline holder count is lower than adding the per-platform numbers together — the difference is the overlap, not a missing platform.
A pull is a USDC payment into a platform's gacha-receiver wallet. We bucket pulls by exact amount: for platforms with a published price ladder we filter to that ladder; for others we round to the nearest dollar.
EV (coming soon) = average appraised value of the NFT pulled in the same transaction, divided by the pack price. EV > 1 means the platform's house edge is currently negative for that pack. Requires NFT-output matching, in progress.
What the page measures. Gacha spend is canonical pack-pull volume from the spine. Outboundis USDC leaving a platform's known on-chain gacha wallets. Both are summed over the same 30 complete days, so the windows and the completeness basis match by construction.
Coverage: what a venue must expose. Each leg of the page is counted per venue, and the four are independent. Spend needs pack pulls recorded against the venue in the spine, which every tracked venue has. Outbound needs a known on-chain wallet the venue pays out of, and that wallet's counterparties to be separable well enough that the flow is not dominated by non-players — a venue with no such wallet has no outbound figure at all, and one whose split is known-wrong has the leg withheld rather than estimated. Players needs row-level pulls carrying a wallet, which is what makes concentration and spend tiers computable. Partner attribution needs a partner identifier on the pull itself, which today only one venue's pull memo carries. The coverage matrix on /economics states which venue meets which, and a leg is never inferred from another: a venue that publishes spend tells you nothing about whether its payouts can be counted.
Rule R3. A payout counts only if the recipient wallet has itself spent into the gacha. R3 tests who the counterparty is — it never tests what a transfer was for, so it removes vendors and treasury movement but cannot remove a partner settlement to a wallet that also plays. The R3-verified share states how much of gross outflow passes that test.
Payout ÷ spend.The ratio of those two legs. Above 100% is not automatically an error: when a platform's spend is falling, payouts settle earlier and larger cohorts against a smaller current spend, and the ratio exceeds 1.0 with nothing miscounted. Reading it as margin requires cohorting payouts to the pulls they settle, which is backend work not yet done.
Disclosure states, per platform. Gross — the outbound flow is published under a label saying what it is (players and partners, non-player counterparties included). Suppressed— nothing is published on the outbound side, because that platform's exclusion list misses its dominant non-player counterparties and the resulting rate would be an artifact of the omission rather than a business fact. Spend comes from a separate query and is unaffected either way.
Why net is held. Net is spend minus R3-counted payouts — a small difference of two large numbers, roughly 5% of spend, so a sub-1% error in the payout leg is levered about 20× into it, and it errs in the flattering direction because a missing spender drops a payout. Four reasons can hold it: unsourced (no on-chain payout wallet exists — nothing to compute), reconciliation (the counting is known-wrong for that platform), awaiting-r3-basis (payout days not yet proven to be on the R3 basis), and spender-coverage (the spender set behind R3 is not yet complete enough; it needs about 99% and currently measures lower). A held net is shown as a chip carrying its reason, never as a number, and never as a partial market sum that silently excludes the platform we can actually count.
Warmers run on cron (target hourly). Server-rendered pages read from disk via unstable_cachewith a 1h revalidate window. The "Updated Xm ago" badge in each hero reflects the oldest underlying snapshot, not render time.
If a number looks wrong, tell us. Most discrepancies are invalidation lag (cache hasn't turned over) or scope gaps (off-chain activity we can't see). We add data sources, we don't hand-edit numbers.
Reach us directly: DM @varibletrends on X.