How every rankingis computed.
Each category is ranked on published criteria with published weights. Every score is a pure function of those inputs, the code that orders rows cannot see which links pay, and the build proves both before it ships.
- Categories ranked
- 119
- Categories with a published ranking.
- Published scores
- 983
- Placements with a published score in rankings.json — the number the order is rebuilt from.
- Criteria
- 468
- Across 119 category models; weights sum to 100 in each.
- Considered, refused
- 603
- Products a category considered and turned away, each with a published reason. Not a share of the field: the field is not countable.
- Reconstructable
- 119/119
- Categories whose displayed score is a function of the published breakdown. The exception table is read by the gate that checks it.
- Ranking-blind
- 392 modules
- 34 entry points across 6 surfaces (the published order, Fit, search relevance, provider discovery, the featured lists and the /vs/ verdicts and every "why it leads" line) walked; none can read payout, partner status, outbound routing, revenue and click or conversion telemetry. Checked 2026-09-18.
Five names, five things
A number on this site goes by exactly one of five names. Two are published and identical for every reader; two are computed from the reader's own answers; one is money for a stated situation. A build check fails when a surface prints a word these replaced.
- ChainChoice ScoreOverall rank
- The published 41–99 figure a product carries in a category: its criterion strengths under the published weights, plus availability, friction, trust and quantitative data under the published base weights, computed before any reader answers anything and identical for every reader.Not a rank. Two products can share a ChainChoice Score and still be ordered by the tie-break; a score of 78 says nothing about position until the pool is read.Produced by: The ranking engine under default inputs, published in /data/rankings.json with its breakdown.
- Overall rankOverall rank
- The published order of a category: every product by ChainChoice Score, ties broken by the published tie-break, the same for every reader. "#1 overall" is position 1 in this order.Not a fit. It knows nothing about the reader — no country, no stated requirement, no scenario — and does not change when the reader answers questions.Produced by: The ranking engine under default inputs, published in /data/rankings.json as rank per product.
- Fit for youFit for you
- The same arithmetic as the ChainChoice Score, run under the reader's own answers: a criterion marked required doubles its published weight, preferred multiplies it by 1.4, and stated attributes claim the preference points. Different answers, different figure.Not the ChainChoice Score. It is printed beside the published figure with the shift between them, so a reader can see how far their own answers moved it — and it can be lower.Produced by: The ranking engine under the reader's inputs, computed in the browser at the moment of the run and part of no published file.
- Fit rankFit for you
- The order of a category under the reader's own answers: products the stated country cannot use are removed, the rest are ordered by Fit for you. "#1 for you" is position 1 in this order.Not the Overall rank, and never printed in its place. Both orders stay on the page: the Overall rank so the reader can see what the answers changed, the Fit rank so they can see what their answers did.Produced by: The ranking engine under the reader's inputs; a saved decision stores its #1 so the replay can say whether the Fit rank has since changed.
- Scenario economicsScenario economics
- A money figure for one stated situation — an annual cost, a net yield, a transaction cost — computed from the published pricing block and the amounts, country and period the reader entered.Not a ranking and not a score. The cheapest product in a scenario is a fact about that scenario; it does not move the ChainChoice Score, the Overall rank or the Fit for you, and a scenario with an unknown price prints "Unknown", never 0.Produced by: The typed pricing model (lib/pricingCore) under the reader's scenario inputs, in the browser.
The three chips above are the same words the authority badge prints on every surface that names a #1 — the chip reads its label from this vocabulary, so the badge and the glossary cannot disagree. “#1 overall” is position 1 in the Overall rank; “#1 for you” is position 1 in the Fit rank; a “lowest known cost” chip is Scenario economics and ranks nothing.
How a score is computed
Three stages, each published. The first is the methodology you can inspect per category below; the second and third are the constants the engine applies to every category alike.
Criteria to methodology points
Each criterion is scored 0–10 from public evidence. Its contribution is
weight ÷ 100 × score ÷ 10 × 32, so a category's criteria together control 32 of the 40 objective points. The remaining 8 are preference points: unclaimed in the ChainChoice Score wherever a category is scored on its own criteria, because nothing is stated there, and claimed by the attributes you state in a Fit for you run; they tilt, they do not decide. A criterion without a receipt is not scored — it contributes nothing and is not read as 0.Fit for you re-weights the criteria rather than adding a bonus: a criterion you mark required has its published weight doubled and the rest renormalise; preferred multiplies it by 1.4. The sentence "your weighting moved cost from 18% to 33%" is one you can check.
Five dimensions to a weighted total
The criteria dimension (
objectiveFitin the feed) joins availability, the friction dimension (frictionFit), trust bonus and quantitative data under published base weights; the total is the ChainChoice Score. A base weight is how much a dimension could move a score; each category also publishes how much it actually did.availability20objectiveFit30frictionFit10trustBonus8quantitative18profileFit0- Weighted total
weightedTotal = round((SUM over dimensions of (breakdown[d] / baseWeight[d]) * weight[d]) / (SUM of weight[d]) * 86, 6 decimal places), where every breakdown[d] is a multiple of 0.1- Absolute score
absolute = min(99, max(40, round(weightedTotal <= 20 ? 40 + weightedTotal * ((60 + (20 / 86) * 38 - 40) / 20) : 60 + (weightedTotal / 86) * 38)))- Pool-relative score
score = round(min(min(99, max(41, leaderScore - (leaderWeighted - weightedTotal) * 2.6)), scoreOfRowAbove))
These dimensions are computed and published in every breakdown but carry no weight in the total. profileFit left the composite in methodology 2026.09.2: it was constant inside all 114 categories, so its 20 points moved every product in a pool identically and ordered nothing. Sum the breakdown against baseWeights and the unweighted terms are simply absent from the arithmetic — that is the intended reading, not an omission.
A base weight is how much a dimension COULD move a score, not how much it did. Each category publishes dimensionSpread: the range that dimension actually covered across its pool. A spread of 0 means the dimension was constant there and decided nothing, however large its weight.
Read verbatim from rankings.json, generated 2026-09-27. Scores are clamped to 41–99.
Pool-relative score, then the Overall rank
The leader anchors the pool; every other row sits below it by its weighted distance, and no row may print above the row above it. The order itself comes from the chain below, the one the engine applies and the feed publishes as
formula.tieBreakChain; each key is read only when every key before it is equal.- availabilitySource, for a reader who states a country only: in perp_dex, perp_house_vaults, options_vaults, prediction_markets, a row whose availability in that country rests on a region tag its record gives no source for (no availability note quoting the provider's terms, and no dated country entry) sorts below every row whose availability is sourced. No row carries it in the orders published in this file, which state no country.
- weightedTotal as step 1 states it, higher first. Only rows whose weighted totals are exactly equal reach the keys below.
- unroundedWeightedTotal, higher first: step 1 over the dimension points before they are kept to a tenth of a point, published per product. Since methodology v2 a shared weighted total from different unrounded points is ordered by those points, so only rows equal on both reach the keys below.
- criteriaAverage, higher first: the row's unrounded weighted average of its published criterion scores (0 to 10) under the weights in use. Applied only when both rows are scored on their category's criteria and the averages differ; otherwise the keys below decide. Since methodology 2026.09.12.
- tiebreakDelta, higher first: the sum of three factors. (1) Price: when the category has one comparable pricing basis that may decide rank (priced for at least two of its catalog rows, not an entry-plan figure derived from a price ladder, and quoted in a single currency), a priced row earns 0 to 2 points in proportion to where its price sits between the highest and the lowest in the pool, or 1 point when every published price on that basis is equal; a row with no price on that basis, and every row of a category without such a basis, earns 0. (2) Strength: 1 point when at least three of the row's catalog fitStrength values are 9 or above; those values are its published criterion scores, plus further strength keys on some rows. (3) Dimension: 1 point when the row scores at least 85% of the maximum on the highest-weighted dimension of the weights in use (the first in weights order when two are equal). A row outside the alternate product catalog (every payment_gateway row) carries 0. It orders rows and is never added to a score.
- objectiveFit points, higher first.
- product name, alphabetical.
The published per-category tieBreakRules are not yet applied by the engine; where two rows share a weighted total and an unrounded weighted total, the chain above decides. Since methodology 2026.09.12 the first key after the totals is the two rows' unrounded weighted criterion averages, so a tie between rows scored on the published criteria is ordered by those criteria; the generic factors decide only where the averages are equal or a row has no criterion scores. tieBreakDecisions counts only pairs equal on both totals, and againstCriteria lists any of them still ordered against the criteria.
Determinism is asserted in the test suite: the same inputs always produce the same order, across every live category.
Editorial principles
Independence
No provider can pay for a position. The modules that decide the published order, Fit, search relevance, provider discovery, the featured lists and the /vs/ verdicts and every "why it leads" line cannot import the affiliate registry, the outbound-link resolvers or the click telemetry; a build gate walks all 392 of them, fails the build if one can, and re-proves on every build that it would catch a planted read. Referral links are declared on the row, never in the score.
Transparency
Every weight, criterion and constant on this page is the one the engine runs, read from the same module. The full ranking with its breakdowns is published at rankings.json so the order can be rebuilt outside this site.
Fit rank beside the Overall rank
There is no single best product. A country you state removes providers that do not serve it; a criterion you mark required re-weights the published model. Both changes are shown next to the result: the Overall rank stays visible beside your Fit rank, and neither is ever printed in the other's place.
Continuous review
Sources are re-read on a published cadence — 45 days for 119 of 119 categories — and every read is dated. The current evidence window runs 2026-08-05 to 2026-09-05; 71 of 119 categories carry a dated read, the rest say so.
What a score may rest on
A criterion is scored from a public page with a quote and a URL, read on a dated sweep. Where that receipt is missing the placement is published as needing evidence, not dressed as verified.
- Sources per product
- ≥ 4
- Required in 113 of 119 categories, with at least 4 structured facts.
- Needs evidence
- 406
- Published placements with zero public receipts — a score with no quote-and-url cell behind it yet.
- Complete ladders
- 78/468
- Criteria whose 0–10 rungs are all written; 58 more are partial. A published score is checked against every rung that exists at build time.
- Live feeds
- 5
- Price, volume and yield feeds regenerated on the build; last 28 Sep 2026. They inform quantitative cells, never a criterion score.
What is not measured
- Nothing is tested by transaction. Fees are read from published schedules and receipts, not from live orders placed by us.
- No provider is interviewed. A claim on a provider's own page counts as that provider's claim, and is labelled as such.
- Outcome accuracy publishes only above 30 responses. Below that floor the accuracy page shows its empty state rather than a percentage.
- The field is not countable. 603 refusals are named with reasons; no share of "all providers" is claimed because no such denominator exists.
How availability and other claims are stated
A sentence on a product page comes from one of six places, and the page says which. Availability is the sharpest case: a provider’s own “global” tag, a region it lists, and a country an editor checked at a named source are three different things, and they are printed in three different words. Only 12 provider × country pairs are verified today; everything else is labelled as what it is.
The nine availability states
- Verified in Germany
- An editor confirmed availability for this country at a named source, within the last six months.Rests on: Verified fact. Example for Germany: “Availability in Germany verified on 2026-09-28.”
- Verified: not available in Germany
- An editor confirmed the provider does not serve this country, at a named source, within the last six months.Rests on: Verified fact. Example for Germany: “Verified not available in Germany on 2026-09-28.”
- Lists Europe; Germany not individually verified
- The provider lists the region this country is in. The country itself was not checked.Rests on: Provider claim. Example for Germany: “Provider lists Europe among its markets. Germany itself was not verified.”
- Provider states broad availability
- The provider states broad availability. No restriction naming this country was found in the sources read.Rests on: Provider claim. Example for Germany: “Provider states broad availability. No restriction naming Germany was found in the sources read; Germany itself was not verified.”
- Not among the markets it lists
- The provider lists the markets it serves and this country is not among them.Rests on: Provider claim. Example for Germany: “Provider lists the markets it serves and Germany is not among them. Not verified by ChainChoice; this is the provider’s own list.”
- Restricted in Germany
- The provider’s own terms name this country as restricted.Rests on: Provider claim. Example for Germany: “Provider states: Germany is a restricted market. Not verified by ChainChoice; the provider’s own terms say so.”
- Existing customers only in Germany
- The provider serves existing customers in this country but takes no new ones.Rests on: Provider claim. Example for Germany: “Provider states: existing customers in Germany are served, new sign-ups are not.”
- Waitlist in Germany
- The provider has announced this country and is taking a waitlist.Rests on: Provider claim. Example for Germany: “Provider states: Germany is announced and taking a waitlist; the service is not open there yet.”
- Availability not published
- The record does not say, or no country was stated.Rests on: Unknown. Example for Germany: “The record does not say where the provider operates.”
A verified state needs a country entry with a source URL and a date younger than 180 days; an older entry falls back to what the record says. Green is used for a verified “yes” only. A provider’s claim and a region listing are amber because they are provisional; an omission or a named restriction is red; nothing stated is grey.
The six claim types
- Verified fact. An editor read it at a named source on a stated date.
- Derived metric. Computed by the engine from verified facts; the formula is published.
- Provider claim. The provider says so. ChainChoice has not checked it.
- ChainChoice judgment. A ranking or score the published methodology produced.
- Editorial context. Background written by an editor; not a fact about the record.
- Unknown. The record does not say.
A provider’s own figure that a page has to show — a country count, a location count, a coverage claim — is printed with the words “Provider states:” in front of it. A build check reads every product’s headline fields and fails when marketing language appears there without that attribution; a second check reads every source file and fails when any surface composes an availability sentence from a country name instead of from the state.
Four things that were one badge
Until 2026-09-09 one badge printed a rebuild notice when a receipt file failed to load, “Low” when a category had no research payload, and “High” when everything was in order — three unrelated facts in one word. They are now four named states, each derived from its own input, and a surface prints the one it means.
Score evidence — does the published score reconstruct
- Verified
- Every criterion strength reconstructs from a quoted observation with a source URL, and the build checks that each equals the published value.572 of 983 published scores today.
- Partial
- Some criterion strengths have no observation on file, or their quote carries no source URL a reader could follow.5 of 983 published scores today.
- Invalid
- An observation on file disagrees with the published strength. The ranking is not restated until the two agree.0 of 983 published scores today.
- Unknown
- No structured observation is on file for this provider in this category; the strengths are the catalog’s published values.406 of 983 published scores today.
Read from the build’s own count of quoted, sourced cells per provider, never from a file fetched in the browser — so the state is the same before, during and after the receipt file loads. A build check keeps every research score equal to the published strength, which is why a sourced cell counts as a reconstructing one; a disagreement found at run time is the only way to “Invalid”, and it withholds the leader’s title until the two agree.
Public receipts — did the file arrive
- Available
- The receipt file loaded; every quote can be opened beside its score.
- Rebuilding
- This build expects a receipt file the server has not published yet. The scores stand on receipts verified at build; the quotes return when the file lands.
- Failed to load
- The receipt file could not be fetched from this connection. Nothing about the score changed; reload to try again.
- No receipt file
- This category publishes no receipt file, because no structured research payload exists for it yet.
A transport state: it says what the page can show, never what a score is worth. 72 of 119 categories publish a receipt file; the other 47 say “No receipt file” without making a request. A file that fails to load leaves every score, band and rank as it was.
Evidence confidence — the band a reader sees
- High
- Every criterion is scored and at least three of them carry a quoted, sourced receipt.
- Medium
- Either every criterion is scored or at least three receipts are on file — not both.
- Low
- Fewer than three receipts on a partly scored product, or no receipt with a source URL at all — including a category whose quotes were filed without one.
- Not counted
- No structured observation is on file for this category, so there is no receipt count to band.
Example reasons, as printed: “4/4 criteria scored, with 4 dated sources quoted.” · “4/4 criteria scored, with 4 quotes on file, none carrying a source URL.” · “No structured observation on file for this category; the receipt count is not counted.” The band reads the same build-time count as the validity above; nothing about a fetch can lower it.
Freshness — how old a date is
- Ranking snapshot
- Always current: a snapshot is true of its own day and is not claimed as today’s.
- Evidence verified through
- Current to 90 days · aging to 180 · stale beyond.
- Live feed as of
- Current to 7 days · aging to 14 · stale beyond.
- Editorial reviewed
- Current to 180 days · aging to 365 · stale beyond.
- Field verified
- Current to 180 days · aging to 360 · stale beyond.
- Methodology
- Always current: a snapshot is true of its own day and is not claimed as today’s.
A date is judged on the day it is read, against the window for its kind; a category’s own review cadence (119 × 45 days) replaces the 90/180-day sweep window on its model page. Freshness labels and never demotes: an aging or stale date leaves the score unchanged and shows the date so the reader can weigh it. Only a conflict — two sources that disagree — withholds a leader’s title. A date that is not a date is “Unknown”, never silently current.
Category-level methodology
Every category is ranked under its own model: its criteria, weights, ladders, tie rules, evidence rules and sensitivity. Open one to inspect it row by row.
Account Abstraction Infra
Appchains / L3s
Automation & Keepers
Bitcoin Mining Pools
Block Explorers
Blockchain Indexers
Bridges
Bug Bounty Platforms
CDP Stablecoins
Creator Mint Platforms
Cross-Chain Messaging
Cross-chain Swaps
Cross-Chain Token Standards
Crypto Bill Pay
Crypto Cards
Crypto Gift Cards
Crypto Neobanks
Crypto Offramps
Crypto Payroll
Crypto Remittances
Crypto Subscriptions
Crypto-Backed Loans
DAO Governance Tools
Data Availability Layers
Decentralised Compute
Decentralised Identity
Decentralised Storage
DeFi Dashboards
DeFi Insurance
DePIN Networks
Dev Frameworks
DEX Aggregators
DEXs
Enterprise Crypto Accounting
Exchanges
Fiat Rails & Banking for Crypto Businesses
Fixed-Rate Yield
Flash Loan Venues
Hardware Wallets
Incentive Distribution
Institutional Custody
Institutional Execution Platforms
Intent Networks
Key Recovery & Inheritance
KYC & Compliance
L2 Blockchains
Layer-1 Blockchains
Lending & Borrowing
Lightning Payment Infrastructure
Lightning Wallets
Liquid Lockers
Liquid Staking
Liquidity Management
Market-data APIs
MEV Protection
Money-Market Funds
MPC & Embedded Wallets
Naming Services
NFT Analytics
NFT Lending
NFT Marketplaces
On-chain Analytics
On-chain Monitoring
Onchain Attestations
Onramps
Options Vaults
Oracles
OTC Desks
P2P Exchanges
Paid Crypto Research Seats
Payment Gateways
Perp DEXs
Perp House Vaults
Portfolio Tracking
Prediction Markets
Privacy Tools
Private Credit
Proof of Personhood
Relayers
Restaking
Rollup-as-a-Service
RPC & Node Services
Seed Phrase Backup
Sentiment Analytics
Shared Sequencers
Sidechains
Simple Buy
Smart Accounts & Multisig
Smart-contract Audits
SocialFi
Stablecoin Issuance Platforms
Stablecoin Settlement
Stablecoin Yield
Stablecoins
Staking
Structured Products
Tax Software
Token Approval & Revoke Tools
Token Launch Platforms
Token Launchpads
Token Screeners
Tokenisation Platforms
Tokenised Bonds
Tokenised Carbon Credits
Tokenised Commodities
Tokenised Equities
Tokenised Funds
Tokenised Real Estate
Tokenised T-Bills
Trading Bots
Trading Tools
Transaction Simulation
Travel Rule Compliance
Wallet Screening
Wallets
Web3 Apps
Wrapped Assets
Yield Aggregators
Yield Vaults
Published methodology versions
Each version is a dated change to the model. The changelog carries the full entry; the feed names the version every score was computed under.
- v2026.04.0-launchFirst publicly versioned methodology. 11 categories with scoring weights, 5-dimension framework (fees, trust, support, control, liquidity), 6-question default decision flow per category.
- v2026.04.0Outbound provider links now resolve to region-appropriate URLs at click time. US visitors clicking a US-restricted exchange are routed to the operator's US entity (where one exists) or shown a region-block notice instead of a dead link.
- v2026.09.0Trustpilot and App Store averages no longer contribute to any score. They remain visible as evidence on the provider breakdown, labelled as context rather than a scored dimension. The quantitative dimension keeps its 0-18 range: fee and regulatory scoring are rescaled to span it, so the balance between the six dimensions is unchanged.
- v2026.09.1scoreAvailability compared each of a product's markets against the visitor's country with String.includes. On the un-personalised path — every /best page, every prerendered route and the rankings.json feed itself — no country is stated, so the needle was the empty string and every market name matched. Two products were silently excluded from every published ranking, and a 20-versus-18 step became "does this row have a non-empty primaryMarkets array".
- v2026.09.2profileFit is no longer weighted. It took two values across 934 rows — 14 everywhere except the twelve payment_gateway rows — and was constant inside 114 of 114 categories, so its 20 of 106 points moved every product in a pool by an identical amount and never once decided an order. The published total is now 86 points across five dimensions. profileFit is still computed and still shown in every breakdown; it simply no longer pretends to rank.
- v2026.09.3The eligibility gate now reads the decision layer's country verdict for every row before anything is scored. Until now the engine excluded a row only when the visitor's country was one of the 27 the region table maps; a visitor from any of the other 33 questionnaire countries — India, Nigeria, New Zealand, Hungary among them — was ranked against providers whose own market list omits their region, labelled "verify availability" as if it were unknown. The verdict is the same test on the 27 mapped countries (identical on all 26,217 country-by-row pairs) and resolves the other 33 through the wizard's own region at region resolution, which the verdict says. Only an ineligible verdict excludes; unknown is kept and labelled, exactly as before.
Verification surfaces
Every claim above is backed by a public surface that exposes the numbers and their history.
Methodology changelog
Every published change to criteria, weights and constants — version, date, type, categories affected.
View →Data changelog
Every observed change to a published fact — a fee, a licence, a lifecycle — appended beside the value it replaced, never overwritten.
View →Provider universe
984 placements by state — ranked, needing evidence, cut, archived — the 603 named refusals, and the ledger of how the set changed.
View →Correction log
Every published editorial mistake: what was wrong, what was fixed, how it was caught.
View →Outcome accuracy
Whether the #1 of a saved Fit rank held up after 30 days, per category, published once a sample clears 30; the empty state until then.
View →Fit rank drift
How often the #1 of a saved Fit rank changed when the engine was replayed — aggregated from saved decisions, not from the published order.
View →rankings.json
The whole ranking with breakdowns, weights, coverage and sensitivity — the artefact everything on this page reads.
View →Machine-readable schemas for the decision primitives are published at /methodology/spec/ under CC-BY-4.0.
Who publishes this
ChainChoice is operated by Simi Ventures GmbH. These are the people behind it; the checks that run on every build are named by script on /why-trust-us.
Mathias Siemonsmeier
Managing director of Simi Ventures GmbH, the company that operates ChainChoice. He is the person named as approver on each methodology version.
- Approves methodology versions: each entry in the methodology changelog names him as approver
- Responsible for content under §18 (2) MStV, as the imprint states
Simi Ventures GmbH, the operator, may receive referral commission from providers with a live partner programme. Personal holdings: not published.
Jürgen Siemonsmeier
Managing director of Simi Ventures GmbH, the company that operates ChainChoice.
- Managing director of Simi Ventures GmbH, the operator
Simi Ventures GmbH, the operator, may receive referral commission from providers with a live partner programme. Personal holdings: not published.
Automated processes
6 processes run in the build, each named by the scripts that implement it.
- Published ranking feed. Generates the file the published order can be rebuilt from. scripts/generate-rankings-feed.ts
- Ranking verifier. Checks that the order a reader sees is the order the published inputs produce. scripts/check-published-ranking-verifies.ts · scripts/check-order-reconstructs.ts
- Commercial firewall. Keeps commercial data out of the code that computes rankings. scripts/check-ranking-path-blind.ts · scripts/check-affiliate-blind.mjs
- Review cadence check. Holds each category to the re-read interval it publishes. scripts/check-review-cadence-is-kept.ts
- Research drift check. Keeps shipped scores equal to the research that was verified. scripts/check-pool-matches-research.ts
- Methodology version check. Keeps every printed version stamp readable in the changelog. scripts/check-methodology-version-published.ts
Conflict-of-interest disclosure
Simi Ventures GmbH, which operates ChainChoice, may earn a commission when a reader follows a referral link and the provider confirms a qualifying action. Providers cannot buy placement, a score or coverage, and there is no sponsored tier. The modules that compute an order cannot import partner, payout or click data, and the build fails if one can.
The people on the roster above, Mathias Siemonsmeier and Jürgen Siemonsmeier, are the managing directors of Simi Ventures GmbH, the company that may receive referral commission. That conflict is why commission is kept out of the ordering code by a build check rather than by a promise. Their personal holdings are not published.
Questions
If you believe a score is wrong or a fact is out of date, send the page and the fact to the address in the imprint. Published corrections are listed at /methodology/corrections.