Following up on the 'Did I Get a Fair Rate?' feature I shared last week, wanted to share something interesting I've noticed talking to a few founders here since then.
A lot of us building for global users end up needing to make FX-related decisions somewhere in the product, whether it's multi-currency reporting, cross-border payouts, or invoicing in different currencies, and most of us default to "good enough" solutions like daily rate snapshots. Which honestly, is often the right call for most use cases.
But it made me realize how little visibility founders actually have into whether the rates they're working with (personally or for their product) are fair in the first place. That's the exact gap Worldesk.ai tries to close, giving a clear read on whether a rate you got (or are quoting) is actually competitive against the real market rate.
Curious if others here have run into FX/currency decisions in their own products, how'd you approach it?
The hard part is the benchmark, and it's worth settling before you build the score. Everyone quotes mid-market, but nobody can actually transact at it, it's the midpoint of bid and ask. Score against mid-market and every user learns they're being ripped off, because by definition they are, versus a rate that doesn't exist. The honest benchmark is the best rate actually attainable for that corridor, amount and settlement speed. Harder to source, and the only one someone can act on.
Second thing, from building affiliate software with multi-currency payouts: the rate itself bit us less than when we locked it. Order time versus payout time can move more than any provider's spread, so "was this rate fair" is underspecified without a timestamp. Your daily-snapshot point is really a question of which day, and that choice can dwarf the spread you're measuring.
both points are fair and honestly the more important nuance than what I said. the mid-market benchmark thing especially, comparing against something nobody can actually transact at does set people up to feel cheated by definition, even from a provider offering a genuinely competitive rate. best-attainable-rate for the actual corridor/amount/speed is a much harder number to source but a fairer one to score against.
the timing point is one I hadn't fully separated out either, tbh. "what day" quietly becoming the bigger variable than the spread itself is a good way to put it. locking rate at order time vs payout time is exactly the kind of gap that's invisible until it actually costs someone
On sourcing the best-attainable number, since that's the hard part: you don't need every provider's live quote. Two or three transparent-rate providers (Wise, Revolut) publish their real rate-plus-fee via API, so their all-in rate for a given corridor and amount is a defensible "attainable" floor to score against, far closer to reality than mid-market. It won't be the theoretical best, but "a real rate you could have got today" beats "a rate nobody can transact at" for making someone trust the score.
that's a smart shortcut ngl, using a couple transparent-rate providers as the floor instead of chasing every provider's live quote. way more actionable than theoretical mid-market too. only wrinkle i can think of is corridor coverage, works great for major pairs but gets murkier once you're outside where wise/revolut actually operate
Corridor coverage is the honest limit, yeah. Two ways I'd handle the gap rather than fake a number for it.
Where no transparent provider runs the pair, don't invent a floor — show mid-market with a visible "no transparent comparator for this corridor" flag. Admitting you can't score it fairly is more on-brand for a transparency tool than a made-up best-attainable.
And a lot of exotic pairs are really two legs anyway (local → USD → target), so you can compose an attainable floor from two transparent legs even when no single provider does the direct one. It's messier and you carry two spreads, but it reconstructs a real number where a direct quote doesn't exist.
Either way the coverage map itself becomes a feature: "real benchmark for these corridors, honest blank for the rest" is the exact promise your product is making.
really like how you explained this. just wondering, when you stack two-leg spreads, does carrying both spreads make the reconstructed floor overly conservative, or does it still line up pretty well with reality?
depends on how the corridor actually routes. for properly exotic pairs most liquidity crosses through usd anyway, so the direct quote you'd get from a bank carries both legs internally too, and the reconstruction tracks reality closely. it goes conservative exactly when a provider has direct liquidity in the pair or nets offsetting client flows, because then they're crossing fewer spreads than your model assumes.
which is why i'd treat the composed floor as a ceiling on acceptable cost rather than a prediction: a quote that beats it is a signal you've found direct liquidity, not a broken benchmark. one wrinkle for small amounts, if each leg carries a fixed fee the composed floor gets noticeably more conservative at the low end, so worth making it amount-aware.
yeah that ceiling vs prediction framing is such a clean way to put it, gonna steal that lol. one thing i keep running into is explaining that distinction to non-technical folks, like "your rate beat my benchmark" sounds like a red flag on the surface even when it's actually just someone finding direct liquidity. how do you usually phrase that so it doesn't sound like you're just moving goalposts
name the comparator instead of the concept. "benchmark" sounds like a scale you control, which is exactly why beating it reads as moving goalposts. "better than Wise for this corridor right now" is just a fact, nobody argues with a fact that has a timestamp on it.
so the line for normal people is something like "0.4% better than the best everyday rate we found (Wise, 14:32)" — concrete provider, concrete time, and the delta does the talking. keep the abstract score for power users if you want, but the sentence under it should always name a real provider a human could google in ten seconds.
one in the headline, all of them one click deep. the headline's job is a single defensible fact ("0.4% better than Wise, 14:32"); three logos up front turns your proof into a comparison table, and the reader starts auditing the benchmark instead of the rate. but the expandable detail should list every provider you checked, with rate and timestamp each. most people never open it and that's fine, trust comes from the drill-down existing, not from reading it. the few who do open it are the ones who'll defend your number in public later.
yeah "moving goalposts" is exactly the vibe an abstract benchmark gives off even when it's accurate. do you think showing multiple providers (wise, revolut, whatever) at once makes it more trustworthy, or does that just add noise and confuse the main point
I'm curious what convinced you the core problem is helping people judge whether an exchange rate is fair, rather than helping them obtain a better one.
Was there something you kept hearing from founders that pointed you toward transparency as the more valuable problem to solve?
good question, tbh. yeah, it kept coming up in slightly different forms, people assuming a rate was fine simply because a platform gave it to them, with no easy way to check that assumption. helping someone get a better rate implies switching providers or negotiating, which isn't always realistic or necessary. but almost everyone, regardless of provider, benefits from just knowing where they actually stand. felt like the more universally useful problem to solve first
Appreciate the context.
Would be interesting to continue the conversation as you learn more from those user patterns.
What's the best email to reach you on?
for sure, happy to keep this going! you can reach me at chel14bleesh24@gmail.com, feel free to send over any questions or updates on your user patterns anytime
Thanks! I’ve just sent it over.
Looking forward to hearing your thoughts whenever you have a chance.
got it, already replied to your email! will take a look when i get a chance