The quote was clean and the payout was short
21 October 2026
A partner desk wrote to us with a question we had not thought to ask ourselves. They had been watching our rates panel and noticed that one provider’s prices beat everyone else’s on nearly every pair. Was the fee we charge, they wanted to know, actually the same at every provider?
We were confident it was. One number, set in one place, asked of everybody. That was the rule the code had been written to follow and the comment beside it said so.
The number was the same. What it did on arrival was not, and checking that turned up something worse than the thing we were checking for.
Two kinds of fee that look identical in a settings box
A comparison site can be paid by an exchange in two completely different ways, and the difference is invisible from a dashboard.
The first is a share of the exchange’s own margin. They were already making money on the trade; a slice of it comes to us. The customer’s rate is untouched, and because it never reaches the quote, it cannot move anybody up or down a ranking. It can differ freely between providers and nothing is distorted.
The second is a markup on the customer’s rate. It comes out of what they receive. It makes that provider’s quote worse by exactly that much, and it moves them down a list that is sorted by what arrives.
Only the second kind has to be equal. The rule is not “charge everyone the same” — it is nothing that changes a quote may differ between providers. We had been applying the first rule and believing it was the second.
The thing we went looking for was not there
The suspicion was that the comparison had a thumb on it: that one provider was being sent a commission the others were not, making its quotes look half a percent worse than they really were, and that the provider who kept winning was winning partly because of our own configuration.
It was a reasonable suspicion and it was wrong. Both places the commission was applied sat in the code that creates an exchange. Neither sat in the code that quotes one.
So the panel was honest. Every provider was priced without a commission and ranked on what it actually offered. The ranking had never been tilted.
And anyone who picked that provider received about half a percent less than the panel had promised them, for as long as a partner rate had been set.
Invisible by construction
This is the part worth sitting with. There was no screen on which this fault appeared.
The quote was correct — it was a real price from a real provider with nothing added. The order was correct — the provider did precisely what it was asked to do. Each half was right on its own terms. The error existed only in the relationship between them, and nothing in the interface renders a relationship.
A customer could not have caught it. They would have to have recorded the figure on the comparison, waited for the transfer to settle, converted units, accounted for network fees, and noticed a gap of half a percent. Nobody does that, and the people most likely to try are the ones who would assume the difference was a rate movement.
We could not have caught it by looking either. The only artefact that showed it was the gap between two functions two hundred lines apart, and the only reason anybody opened them was a question about something else entirely.
The rule was already written down
The uncomfortable part: this exact fault is described in our own source, in a comment explaining why a different provider is deliberately never sent its equivalent commission parameter. That provider’s API accepts a fee only when an order is created, not when a price is quoted, and the note says plainly that an exchange paying less than the rates panel promised is a worse fault than commission left uncollected.
We had reasoned it through, written it down, refused to ship it in one place — and were doing it in another, two hundred lines away, the whole time.
Knowing a rule is not the same as holding yourself to it everywhere, and a principle recorded next to the one case where it was obeyed is not a safeguard. It is a note.
What changed
No provider is now sent a commission when an order is created unless the same figure reached the quote that produced it. Where a provider’s price endpoint cannot accept one, the same arithmetic is applied to the estimate instead, so the two agree by construction rather than by luck.
The setting that carried the old number is gone entirely. Once no provider was being sent it, it was a box that governed nothing — and a control that does nothing is worse than no control, because the next person to read it believes a fee is being charged and has no way to tell otherwise.
A commission belongs in the comparison, not at a provider. Applied there, it is one figure across every quote after they are all collected, reported in the response, and structurally incapable of making an order disagree with the price that produced it.
The question nobody inside asks
The partner who wrote to us was asking about their own competitiveness. They had no view of our code, no access to our settings, and no interest in our internals. They had one observation from outside — a provider that kept winning — and one question about it.
That observation was correct, the explanation they suspected was wrong, and the explanation underneath it was something we would not have gone looking for. We have since told them so, including the part that reflects badly on us, because an audit nobody can see is not evidence of anything.
It is worth being the kind of operation that gets asked. Most of the faults on this site that mattered were found by somebody looking at it from a position we could not occupy — a partner, a reader, somebody checking a figure against an account somewhere else. The errors we find ourselves are the ones that show up on a screen. The ones that do not show up on a screen need someone else.
Every figure above can be checked against the providers yourself — no account, no sign-up, and nothing is held for you at any point.