Why DEX aggregator quotes differ, and how to compare them fairly
Same pair, same amount, different numbers. Fees, gas, timing, simulation and positive slippage policies explain most gaps. Here is how to compare fairly.
Open two swap interfaces side by side, type the same amount, and you will rarely see the same output. Sometimes the gap is real: one service found a better route. Often it is an artefact of how each number was produced. Before you decide which quote is better, it helps to know what each one includes and when it was made.
This guide lists the usual reasons quotes differ and ends with a short protocol for comparing them fairly. We wrote it from the point of view of a team that has had to do exactly this kind of comparison for its own engine, and we use Tirio's own rules as the worked example.
1. The quotes were not made at the same moment
Pool prices change with every trade, and on BNB Chain a new block arrives in well under a second. Two quotes fetched two seconds apart can easily come from different blocks, with different pool states.
Here is a small example from our own API on 2026-10-01. An indicative price for 1 BNB to USDT showed 767.96 USDT. A simulated quote for the same trade, fetched about a second and a half later, showed 767.85. The difference is 0.014 %, and it came from one service talking to itself. Two services queried at different moments can differ by more than that without either being worse.
Fix: send the requests as close together as you can, repeat the comparison several times, and look at the typical result rather than one sample.
2. Fees are counted in different places
Fees can sit in at least three places, and interfaces display them differently.
- Pool fees are always inside the output. No one shows them separately because the pool deducts them itself.
- Interface or aggregator fees may be included in the displayed output, shown on a separate line, taken from the token you pay or taken from the token you receive.
- Gas is almost never included in the displayed output.
A simple illustration with made-up numbers. Interface A shows "You receive 999.40 USDT" and lists a 0.10 % fee on the output underneath, which will be deducted on settlement. Interface B shows 998.90 USDT with its fee already taken. A looks better at a glance, yet after its fee it delivers about 998.40, half a dollar less than B.
For reference, here is where Tirio puts its fees. The tirio.io app adds a 3 bps Tirio fee taken from the token you pay, so the output it shows is already net of that fee. Quotes requested from our public API carry no Tirio fee at all. The Router contract's own protocol fee is currently 0, and every quote reports it in a feeBps field so integrators do not have to assume.
Fix: compare what lands in your wallet after every fee, in the token you receive.
3. Gas matters more than you think on small trades
Gas on BNB Chain is cheap, which tempts people to ignore it. For large trades that is fine. For small ones it is not.
Take a $20 swap. Suppose one route uses three pools and another uses one, and the first needs 300,000 more gas. At a gas price of 0.05 gwei and a BNB price around $770, that extra gas costs about 1.2 cents. On a $20 trade that is roughly 6 bps, more than many fee differences people argue about.
Good routers count gas when they decide whether a split or an extra hop is worth it. Tirio does this whenever it knows the price of BNB in the output token. Still, a quote that shows a higher output with a much larger gas estimate may not be the better deal for a small order.
Fix: subtract the network fee, converted into the output token, before you compare.
4. Indicative prices are not executable quotes
Many interfaces show a fast indicative price while you type and build the real transaction only when you press review. Some APIs return a price without a transaction at all. An indicative price is a routed estimate. It may skip the full simulation of the transaction, and occasionally a route that looks good on paper fails or pays less when it runs.
At Tirio, the price shown while you type is routed but not simulated. The quote you sign is simulated as the complete transaction against the latest block, and the simulated output is what you see. Comparing one service's indicative price with another service's simulated quote compares two different things.
Fix: compare executable quotes, ideally ones that come with transaction data, and note whether each was simulated.
5. Slippage settings change the guaranteed amount
The headline output is an expectation. The amount a contract enforces is the minimum received, which depends on your slippage tolerance. Interfaces use different defaults, and some pick a tolerance automatically. A quote with a slightly higher expected output and a much looser tolerance gives you a weaker guarantee.
Fix: set the same slippage everywhere, and compare minimum received as well as expected output.
6. Positive slippage policies differ
Sometimes the market moves in your favour between the quote and the block your swap lands in, and the route pays more than quoted. What happens to that extra is a policy choice, and it differs between services. Some pass all of it to you. Some keep part of it.
Tirio keeps part of it, and we would rather say so plainly. On a sale of an exact amount whose output token has no transfer tax, if the swap delivers more than the quote, the Router keeps the excess up to 1 % of the quoted output, and anything beyond that cap goes to you. If the swap delivers less, you receive less, down to your minimum. Buy (exact-out) swaps and taxed tokens are not affected. The same rule applies to swaps built from our API.
What that means for a comparison: on those swaps, the Tirio quote is close to the most you will receive. A service that passes positive slippage through can pay more than its own quote when markets move in your favour. Over many trades in volatile markets that difference is real, so weigh it next to the quote itself.
Fix: read each service's documentation on positive slippage, and when you test with real trades, compare what arrived against what was quoted.
7. Taxed tokens and token quirks
Tokens that take a fee on every transfer break naive quoting. If a service ignores the tax, its quote can look several percent better than one that accounts for it, and the swap then fails or pays less. Tirio probes tokens for buy and sell taxes, builds a detected tax into the quote, and says so when a tax could not be measured. Our guide to taxed tokens covers this in detail.
Fix: leave taxed tokens out of price comparisons, or compare only quotes that state the tax they assumed.
8. Different services reach different liquidity
Aggregators read different sets of venues: classic and concentrated-liquidity pools, stable pools, on-chain market makers, launchpad curves. Which venues a service integrates, and how quickly it picks up a newly created pool, changes the price it can offer on a given pair. The list of venues Tirio routes through is public at /bsc/protocols, and our glossary explains the venue types.
Coverage also shows up as a missing route. A service that returns no route for a long-tail pair has not given a worse price. It has given no price, and a fair comparison counts those cases separately instead of dropping them.
Fix: record "no route" as its own outcome, and note which venues each route used.
A fair comparison in seven steps
- Same request. Same pair, same direction, same exact-in or exact-out mode, same amount in raw units.
- Same moment. Fire the requests together and repeat them. Prices move every block.
- Same fee setting. Turn off optional partner or referral fees, or account for them, and note any interface fee.
- Same slippage. Compare minimum received at one tolerance.
- Net of gas. Convert each gas estimate into the output token and subtract it.
- Executable only. Prefer simulated quotes with transaction data over indicative prices.
- Many pairs, medians, misses. One pair proves little. Use many pairs and sizes, report the median difference, and count the pairs where a service found no route.
When we measured our own engine on 2026-10-01, we followed the same rules: 185 BNB Chain pairs, identical requests sent to every service in the same run from one client, tokens with a transfer tax left out of the price comparison, medians rather than averages, and missing routes counted on their own. The method and its limits are on our benchmarks page.
The only number that settles it
A quote is a forecast. The receipt is the result. After a real swap, open the transaction on BscScan and look at the token transfers to your address. ERC-20 tokens emit a Transfer event for every movement, as defined in the token standard, so the amount you received is on chain for anyone to check. Compare it with the quote and with the minimum you accepted. Do that across a handful of trades and you will know more than any screenshot of two quotes side by side can tell you.