The first cross-platform arb I ever booked in my head, before I ever sent an order, turned out to be nothing. Same event, two platforms, prices apart by enough that it looked like free money if you took both sides. I sat with it for a while and then realized the two contracts did not actually ask the same question. One resolved off a named agency print. The other resolved off a media call. On the day, those two things disagreed, and the trade I had drawn up would have lost on both legs. Nobody mispriced anything. I just paired two contracts that were never the same contract.
That is the failure mode I want to walk through, because it is the one that eats people who are otherwise doing everything right. The prices are real, the spread is real, the liquidity is real. The equivalence is the fiction.
Why lookalikes are so common
Prediction platforms compete on the same headline events. When something is in the news, Polymarket, Kalshi, and Metaculus will all have some version of it, because that is where the volume is. So you end up with three markets that share a title, share a deadline that is close enough, and share the obvious yes/no framing. From a scraper's point of view they look like the same row three times.
The trouble is that each platform writes its own rules doc, and those docs are written by different people optimizing for different things. Kalshi is a regulated exchange, so its contracts lean on a specific, named settlement source and a precise timestamp, because they have to be defensible. Polymarket contracts often point at a source too, but the resolution language leaves more room, and the ultimate backstop is an oracle dispute process rather than a single agency print. Metaculus is not even a market in the trading sense. It is a forecasting platform, and its questions resolve on admin judgment against criteria that were written to measure forecasters, not to settle a payout. Three different jobs, three different rulebooks, one shared headline.
So the title matching that feels natural is exactly the thing that gets you. You have to diff the fine print, not the headline.
The four places the fine print splits
Almost every false twin I have caught breaks on one of four things. When I look at a candidate pair, I check these in order, because the cheap checks kill most bad pairs before I bother with the expensive ones.
- Source of truth. What exact thing does this contract read to decide? A named agency release, a specific data vendor, an exchange's official close, a court docket, a media consensus call. If the two contracts read different oracles, they can diverge even when reality is identical, because the two oracles can disagree with each other. This is the one that got me.
- Timing and the exact boundary. Resolution date, resolution time, and the timezone the boundary is measured in. "By end of the quarter" on one platform and "by the last business day" on another are not the same boundary, and a print that lands in the gap resolves one side and not the other. Crypto is the worst offender here because a price at 23:59 UTC and a price at midnight Eastern are two different numbers on a volatile day.
- The threshold and rounding. "Above 3 percent" versus "3 percent or higher" is a real difference when the number lands exactly on the line. Same with which decimal place gets rounded, and whether they use a revised figure or the first release. Econ contracts get revised after the fact, and one platform may settle on the initial print while another waits.
- Edge-case and void rules. What happens if the event is postponed, if the source stops publishing, if a candidate drops out, if the underlying gets delisted. One platform voids and refunds. Another rolls the deadline. Another resolves no by default. Two contracts that agree on the base case can pay out opposite ways in the tail, and the tail is exactly where the cheap-looking spreads live.
A concrete diff, three domains
Take an election contract. Platform A says it resolves when a race is called by a named wire service. Platform B says it resolves on certified results. Most of the time those agree. In a close race they can be days or weeks apart, and a call can get walked back before certification. If you paired A and B as identical and the race was tight, you were long the gap between a call and a certification, which is not a position you meant to hold.
Take an econ contract on an inflation or jobs print. The obvious trap is the revision. One contract settles on the number as first released, another on the figure as it stands at resolution, which may already be revised. The subtler trap is the threshold phrasing around the exact boundary, plus whether they use the headline figure or a core figure. Two contracts on "the same" print can read different columns of the same release.
Take a crypto contract on whether a coin is above some level by a date. Here the split is almost always the reference price and the exact instant. One reads a single exchange's close, another reads an index across venues, another reads a spot price at a precise UTC second. On a quiet day they agree to the dollar. On a day with a wick, the index and the single-venue print can disagree by real money at exactly the moment that decides the contract.
How I actually build the check
The point of all this is not to read rulebooks by hand forever. It is to turn the read into a repeatable diff so an aggregated view flags real equivalents instead of lumping in the false twins. The workflow I use looks like this.
- Pull the full resolution text for each candidate, not the title and not the summary. The summary is where the differences get sanded off.
- Extract four fields from each: settlement source, resolution boundary with timezone, threshold with its exact comparator and rounding, and the void and postponement rules.
- Compare field by field, not contract to contract. A pair is a true twin only if all four match. If any field differs, it is a candidate for divergence and gets flagged, not paired.
- For anything that survives, write down the specific scenario where the two would still disagree. If you cannot construct a plausible divergence path, you probably have a real match. If you can, you have found your risk, and now you can price it instead of ignoring it.
The last step is the one people skip and it is the one that matters. A pair passing three of four checks is not a green light. It is a narrowed question: under what exact conditions do these two pay out differently, and how likely is that condition. Sometimes the answer is "only if the source stops publishing, which basically never happens," and you take the trade with eyes open. Sometimes the answer is "any time the race is close," and close races are exactly when you wanted the position, so the whole thing is hollow.
When we wire cross-platform signals into Blockcircle, the resolution diff sits upstream of any pairing, because a matched view that treats false twins as arbitrage is worse than no view at all. It hands you confidence in the exact spots you should be most suspicious.
None of this is glamorous. It is reading rulebooks and writing down four fields. But the alternative is trusting that two contracts mean the same thing because they share a headline, and headlines are written to attract volume, not to settle payouts. The spread you can see is the easy part. Whether the two questions are the same question is the part that decides if the spread was ever real.