If you read a P2P board the obvious way — cheapest ask, highest bid, subtract one from the other — you will sometimes get a negative number. The best price to buy at comes out *below* the best price to sell at. On the face of it that is free money: buy low, sell high, same rail, same minute.
It is not free money. We scanned 20 fiat markets and found 12 of them carrying at least one rail like this. On India's board, every single two-sided rail did it.
What it looks like
India's UPI rail, the busiest on that market with 258 buy ads and 313 sell ads:
- Best ask: 100.15
- Best bid: 104.21
That reads as a 4% spread in the trader's favour. Two other rails on the same market — IMPS and Bank Transfer — showed the exact same 100.15 ask. That repetition is the clue.
One ad, many rails, both tails
A single advertiser can list several payment methods on one ad. When you group ads by rail, that one ad's price is attributed to every method it accepts. So one unusually cheap ad propagates across UPI, IMPS and Bank Transfer simultaneously, and it sets the "best ask" on all three.
The bid side does the same thing independently. You end up taking the most extreme ad from each of two separate populations, and pairing them as though they were a quote. They were never a quote. Nobody is offering to trade both sides at those prices.
The next-cheapest ask on that market was 102.50 — a 2.3% gap to the outlier. The 100.15 ad was real, but it carried a minimum well above a casual trade size, and verification requirements that gate who can take it at all.
Why an exchange never shows you this
On a conventional order book, a bid above an ask cannot persist for a measurable instant: the matching engine executes them against each other. The invariant that bid is always below ask is enforced by the mechanism.
P2P has no matching engine. Ads are listings. A buy ad and a sell ad at crossing prices simply sit there, because nothing exists to bring them together. The invariant every trading interface quietly assumes is one that P2P never had.
What we changed
Our rail tables used to print whatever the subtraction produced, which meant a rail could show a large negative spread that looked like an opportunity. Now:
- A crossed rail is labelled as crossed rather than given a percentage, with the underlying buy and sell prices still shown so nothing is hidden.
- The headline quote on each market page comes from one rail — both sides from the same rail — instead of combining the cheapest ask on the board with the highest bid on the board. That combination inverted on most markets we checked.
- Markets where every rail is crossed show no summary quote at all. We would rather show nothing than a confident wrong number.
What to take from it
- A negative spread is a data-quality warning, not a trade. It tells you the two sides came from ads that have nothing to do with each other.
- Any tool that reports one spread per market owes you an explanation of how it picked the two sides. Cheapest-ask against highest-bid is the common choice and it is the one that breaks.
- The rail with the most ads is usually the more honest reference. It is where real flow happens, and both sides of its quote come from a population that actually competes.
Common questions
Does a crossed book mean I can arbitrage it?
No. The two prices come from different advertisers whose ads never match each other, and the attractive side usually carries minimum amounts and verification gates that stop you filling both legs. Treat it as a signal that the summary number is unreliable, not as an opportunity.
Why does this happen on P2P but not on a normal exchange?
A matching engine cannot let a bid sit above an ask — the two orders would execute against each other. P2P ads are listings, not orders. Nothing matches them automatically, so nothing stops the two sides from crossing.
Which markets did this affect?
In our most recent scan, 12 of 20 markets had at least one crossed rail. India was the extreme case, with every two-sided rail crossed. Morocco, Indonesia, the Philippines and Argentina had none.