← Back to articles
July 21, 2026
5 min read

The maker-taker decision: fee tiers, rebates, and the true cost of crossing the spread

The maker-taker decision: fee tiers, rebates, and the true cost of crossing the spread
#maker taker
#trading fees
#rebates
#adverse selection
#market making
#execution
#market microstructure
#backtest

Every order you send makes one binary choice before it makes any other: cross the spread and pay the taker fee, or rest in the book and pay the maker fee — maybe even collect a rebate. The industry frames this as a fee optimization, and the fee tables make it look like one: taker 5 bps, maker 2 bps, savings 3 bps, post-only flag on, done. That framing is a costume. Underneath it, maker versus taker is a trade about adverse selection: whether you pay a known price for immediacy, or sell the market an option to fill you at its discretion — an option that informed counterparties exercise precisely when the fill hurts you. The fee schedule prices that option for the average participant. You are not the average participant, and neither is the flow that hits your quote.

This article does the math the fee table hides: the corrected break-even, why Glosten-Milgrom (1985) implies passive fills are structurally biased against you, what real crypto fee tiers and token discounts do to the numbers, why rebate mining died in equities and what mutated form survives in crypto, how queue position sets the true value of a rebate, and how to model all of it in a backtest without committing the single most common fee bug in the business.

The naive break-even — and the term everyone forgets

Notation: quoted spread ss, taker fee ftf_t, maker fee fmf_m (negative if a rebate), all in basis points of notional, mid as the benchmark price. Crossing costs you half the spread plus the taker fee; resting earns you half the spread and costs the maker fee:

Ctaker=s2+ft,Cmakernaive=fms2C_{\text{taker}} = \frac{s}{2} + f_t, \qquad C_{\text{maker}}^{\text{naive}} = f_m - \frac{s}{2}

Plug in Binance USDⓈ-M futures base rates — maker 2 bps, taker 5 bps — on a perp quoted 2 bps wide: taker costs 1+5=61 + 5 = 6 bps, maker "costs" 21=12 - 1 = 1 bps. Apparent saving: 5 bps per trade, every trade. For a strategy doing 20 round trips a day, that is claimed to be 100 bps of daily edge from a checkbox.

Notice something about these numbers first: the fee is not a correction to the spread — on liquid crypto pairs it is the cost. BTCUSDT perp frequently quotes under 1 bps wide while a retail taker pays 5 bps. The half-spread is a rounding error next to the fee. This is the opposite of the equities intuition, where spreads and fees are the same order of magnitude, and it is why in crypto every naive comparison screams "always make." It is also why every first market-making backtest is profitable and most first deployments are not.

The naive maker cost is missing three terms:

  1. Non-fill risk. A limit order is not a trade; it is a lottery ticket for a trade. When it doesn't fill, you either miss the move or cross later at a worse price.
  2. Adverse selection. Conditional on filling, the price is more likely to move against you than the unconditional distribution suggests. This is not bad luck; it is a theorem.
  3. Re-quote cost. Chasing the market with cancel/replace resets your queue position to the back, which silently converts your fill distribution into mostly type-2 fills.

The second term is the one with fifty years of theory behind it, so let's do it properly.

Glosten-Milgrom: the fill is the bad news

Glosten and Milgrom (1985), "Bid, Ask and Transaction Prices in a Specialist Market with Heterogeneously Informed Traders" (Journal of Financial Economics 14), is the cleanest model of why a spread exists at all. A risk-neutral, competitive market maker with zero costs quotes a bid and an ask. Some fraction μ\mu of incoming traders are informed — they know the asset's true value VV — and the rest trade for exogenous reasons, buying or selling with equal probability. The market maker cannot tell them apart. Competition forces each quote to be a conditional expectation:

ask=E[Vnext trader buys],bid=E[Vnext trader sells]\text{ask} = \mathbb{E}[V \mid \text{next trader buys}], \qquad \text{bid} = \mathbb{E}[V \mid \text{next trader sells}]

Worked numbers. Let VV be 101 or 99 with equal probability, and μ=0.2\mu = 0.2. If V=101V = 101, a buy arrives with probability μ+(1μ)/2=0.6\mu + (1-\mu)/2 = 0.6 (all informed buy, half the uninformed buy); if V=99V = 99, with probability 0.40.4. Then

ask=0.50.6101+0.50.4990.5=100.2,bid=99.8\text{ask} = \frac{0.5 \cdot 0.6 \cdot 101 + 0.5 \cdot 0.4 \cdot 99}{0.5} = 100.2, \qquad \text{bid} = 99.8

The spread is μ(VHVL)=0.4\mu(V_H - V_L) = 0.4 — purely adverse-selection compensation. No inventory risk, no fees, no monopoly rents, and the spread is still there, scaling with the informed fraction and the size of what they know.

The consequence that matters for the maker-taker decision: being filled is itself information, and the information is against you. Your resting bid buys more often when the true value is low, because that is when informed sellers show up. Conditioning on your own fill shifts the expected value of what you just bought downward — by construction, not by misfortune. The standard way to measure this is the markout: for a buy filled at price pp, the markout at horizon τ\tau is m(τ)=mid(tfill+τ)pm(\tau) = \text{mid}(t_{\text{fill}} + \tau) - p. Aggregate markouts on passive fills are negative for almost everyone almost everywhere; how to compute them without fooling yourself is covered in Implementation shortfall and TCA.

An equivalent framing that generalizes better: a resting limit order is a free option granted to the market. The counterparty — not you — chooses the moment of exercise, and they exercise when it is in their interest. The maker rebate is the premium the venue pays you for writing that option. The question is never "is the premium positive" but "is the premium larger than the option's value to the people exercising it."

The corrected break-even

Let pp be the probability your quote fills within your decision horizon, A=E[adverse movefill]A = \mathbb{E}[\text{adverse move} \mid \text{fill}] the conditional markout cost in bps, and DD the extra cost you pay when unfilled (drift while you waited plus crossing at the new price). The honest maker cost is:

E[Cmaker]=p(fms2+A)+(1p)(s2+ft+D)\mathbb{E}[C_{\text{maker}}] = p\left(f_m - \frac{s}{2} + A\right) + (1-p)\left(\frac{s}{2} + f_t + D\right)

Making is preferred over taking when E[Cmaker]<s/2+ft\mathbb{E}[C_{\text{maker}}] < s/2 + f_t, which rearranges to a clean inequality:

s+ftfmapparent saving  >  Aadverse selection  +  1ppDodds-weighted miss cost\underbrace{s + f_t - f_m}_{\text{apparent saving}} \;>\; \underbrace{A}_{\text{adverse selection}} \;+\; \underbrace{\frac{1-p}{p}\,D}_{\text{odds-weighted miss cost}}

Taker cost versus honest maker cost decomposition

Same worked example, now with realistic frictions: s=2s = 2, ft=5f_t = 5, fm=2f_m = 2, so the apparent saving is 5 bps. Take p=0.6p = 0.6, A=3A = 3 bps, D=2D = 2 bps. The right side is 3+0.40.62=4.333 + \frac{0.4}{0.6} \cdot 2 = 4.33 bps. Making still wins — by 0.67 bps of margin, not 5. In expectation: E[Cmaker]=0.6(21+3)+0.4(1+5+2)=5.6\mathbb{E}[C_{\text{maker}}] = 0.6(2 - 1 + 3) + 0.4(1 + 5 + 2) = 5.6 bps against a taker cost of 6.0. The checkbox was worth 0.4 bps, not 5, and a modest error in AA or pp flips the sign.

Worse, AA, pp, and DD are not independent knobs — they are jointly driven by why you are trading. If your signal is correlated with short-term flow (every momentum entry is), then during exactly the bursts you want to enter, p1p \to 1 and AA explodes: you get filled instantly, by the move you predicted, at the old price, on the wrong side of it. The maker discount is largest in the fee table precisely for the trades where it is most negative in reality. That is the sense in which the maker-taker choice is an adverse-selection trade wearing a fee schedule.

Real fee schedules: tiers, token discounts, and the marginal-fee trap

Representative schedules on major venues as of mid-2026 (base tier → top public tier; check the venue pages, these move):

Venue Base maker / taker Top tier maker / taker Discount mechanics
Binance spot 10 / 10 bps falls with VIP 1-9 pay fees in BNB: −25%
Binance USDⓈ-M perp 2 / 5 bps 0 / 1.7 bps (VIP 9) BNB: −10%; VIP needs volume + BNB balance
Bybit perp 2 / 5.5 bps 0 / 3 bps MM program to −1.5 bps maker, with obligations
OKX perp 2 / 5 bps to about −0.5 / 1.5-2 bps OKB holdings tier the retail band
Hyperliquid perp 1.5 / 4.5 bps maker rebates to −0.3 bps rebate tied to share of maker volume; staking discounts
Coinbase Advanced 40 / 60 bps 0 / 5 bps volume tiers only
Kraken Pro 25 / 40 bps 0 / 10 bps volume tiers only

Three structural observations.

Retail maker fees are positive nearly everywhere. The equities-style default of "makers get paid" simply does not hold for you until deep VIP territory or a signed market-maker agreement. At base tier the maker-taker decision is "pay 2 or pay 5," not "earn or pay."

Token discounts are a position, not a coupon. Paying fees in BNB cuts Binance spot fees 25% — 2.5 bps per side at base tier, real money at volume. But the discount requires holding an inventory of exchange token, so your fee optimization is financed by beta exposure to the exchange's own equity-like asset. A desk paying 30k/monthinfeesandsaving30k/month in fees and saving 7.5k via BNB, while holding a $200k BNB float, has its whole quarter of fee savings wiped by a 10% BNB drawdown. Treat the float as a book position: size it, hedge it, or accept that you sold volatility to buy a discount. (Several VIP ladders also make token balance a tier requirement, which converts the position from optional to structural.)

Marginal fee ≠ average fee. Tiers are computed on trailing 30-day volume, so today's fee was set by last month's trading — but crossing a boundary reprices all your volume for as long as you hold the tier. This creates a kink in the marginal cost of volume. Suppose the next tier at $15M/30d cuts your taker fee from 5 to 4 bps. With $14M of organic volume, $1M of filler churn costs about 1\text{M} \times (s/2 + f_t) \approx \600andbuysand buys1,\text{bps} \times $14\text{M} = $1{,}400/month of savings — the marginal fee of that last million is *negative*. With \8M organic, the same logic requires $7M of churn costing $4,200 to save $800 — a levered bet that burns real spread and fees on fake volume to earn hypothetical discounts, renewable monthly. Tier-chasing is only ever rational within striking distance of a boundary, and desks that model their fee as a single scalar can't even see the kink.

Rebate mining: rise, death, and the crypto afterlife

The maker rebate is an equities invention. Island ECN introduced it in 1997 to bootstrap liquidity against the incumbent exchanges, and it worked so well that the model conquered US equity market structure; Reg NMS (2005) then capped the taker access fee at $0.003/share (Rule 610), and the standard exchange business became: charge takers ~30 mils, rebate makers ~20-30 mils, keep the difference.

That arithmetic briefly created a pure strategy: rebate capture. Post both sides of a penny-spread large-cap. A round trip that scratches — buys and sells at the same price — still collects two rebates, roughly half a cent per share on zero price PnL. Capture the penny spread too and you triple it. In the mid-2000s this was a genuine industrial business.

It died of three causes, and each one is a lesson:

  1. The rebate is public, so it gets competed into the queue. A posted rebate attracts quoting until the marginal quoter's expected rebate net of adverse selection is zero. On a tick-constrained stock, price can't improve, so competition happens in time priority — and the rent flows to whoever reaches the front of the queue first. The rebate financed the speed arms race; colocation and microwave towers ate the margin. The surviving rebate earners were the firms that would have been quoting anyway.
  2. Where the tick doesn't bind, the rebate isn't even real. Colliard and Foucault (2012), "Trading Fees and Efficiency in Limit Order Markets" (Review of Financial Studies 25), prove the neutrality result: with a fine price grid, only the total exchange fee matters — any split between maker and taker is undone by quote adjustment. Give makers a rebate and they quote correspondingly tighter, handing it straight to takers through the cum-fee spread. The split has bite only when the tick prevents that adjustment — which routes you back to cause #1. The rebate is dissipated either through price or through queue; pick your poison. (Foucault, Kadan and Kandel 2013 give the complementary view: the fee split is the venue's tool for balancing maker and taker participation, not a gift to either side.)
  3. The distortions attracted regulators. Angel, Harris and Spatt, "Equity Trading in the 21st Century" (2011, and the 2015 update in Quarterly Journal of Finance), catalogued the damage: quoted spreads stop measuring true cost because fees and rebates aren't in the quote, best-execution stats become fiction, and brokers face a conflict between the client's fill and their own rebate. Battalio, Corwin and Jennings (2016, Journal of Finance) showed the conflict was not hypothetical: routing to high-rebate venues measurably worsened limit-order execution quality. The SEC circled for a decade — the 2018 Transaction Fee Pilot died in court — and finally adopted amendments in September 2024 cutting the access-fee cap from 30 to 10 mils (compliance since pushed to November 2026). The fat-rebate era in equities is ending by administrative decree.

What survives in crypto is instructive because it is not a revival. Three forms:

  • Public VIP rebates (OKX's −0.5 bps top maker tier and similar): available only at volume levels that select for firms that already won the queue race. The circularity is the equities endgame replayed: the rebate exists to attract makers, and the makers who capture it are those who would quote anyway.
  • Negotiated market-maker programs (Bybit advertises to −1.5 bps): these come with spread caps, minimum size, and uptime obligations. That is not free money; it is a service contract in which you are paid to write the adverse-selection option continuously — including through news, cascades, and the minutes when every discretionary maker has pulled quotes. The rebate is the wage for holding the option book nobody wants.
  • Formula-driven incentives (Hyperliquid pays up to −0.3 bps keyed to your share of total maker volume): an explicit tournament, which at least prices the queue race honestly.

Pure scratch-for-rebate mostly cannot exist in crypto because retail maker fees are positive: at 2 bps maker, a scratch round trip loses 4 bps. The strategy only exists inside negative-maker tiers, and the tiers are the moat.

Queue value: what a rebate is actually worth

Everything above compresses into one pricing equation. The expected value of a resting quote is:

Vquote=p(q)(s2+rA(q))(1p(q))CmissV_{\text{quote}} = p(q)\left(\frac{s}{2} + r - A(q)\right) - \big(1 - p(q)\big)\,C_{\text{miss}}

where rr is the rebate (or minus the maker fee), and — the load-bearing detail — both the fill probability pp and the conditional adverse selection AA are functions of your queue position qq. They move together in the worst possible way. A front-of-queue order fills against benign flow: small takers, noise, the touch-and-bounce prints. A back-of-queue order fills only when the entire level is swept — which is to say, only in the states of the world where the price is going through you. Deep queue positions don't just fill less often; they fill worse. The queue is an adverse-selection filter, and your position in it decides which side of the filter you're on.

Fill probability and conditional markout versus queue position, and the resulting quote value

Numbers. Level quoted s/2=1s/2 = 1 bps from mid, rebate r=0.5r = 0.5 bps, miss cost Cmiss=1.5C_{\text{miss}} = 1.5 bps:

Queue position pp AA (bps) VquoteV_{\text{quote}} (bps)
Front decile 0.85 0.8 0.85(1+0.50.8)0.151.5=+0.370.85(1 + 0.5 - 0.8) - 0.15 \cdot 1.5 = +0.37
Back decile 0.35 3.5 0.35(1+0.53.5)0.651.5=1.680.35(1 + 0.5 - 3.5) - 0.65 \cdot 1.5 = -1.68

Same venue, same price level, same rebate line in the fee schedule — a two-basis-point swing in expected value, sign included, driven entirely by queue position. Moallemi and Yuan (2016), "A Model for Queue Position Valuation in a Limit Order Book," quantify the general result: on large-tick instruments the value of queue priority is comparable to the half-spread, i.e., the same order of magnitude as the entire theoretical edge of a quoting strategy. Estimating where you actually are in the queue — and what cancel/replace does to it — is the machinery of Queue inside the wall; calibrating A(q)A(q) from your own fills, bucketed by queue decile at fill time, is a markout exercise from the TCA toolkit.

The operational rule falls out directly: quote while Vquote>CtakerV_{\text{quote}} > -C_{\text{taker}} relative to your alternative, and cross when it isn't — when the queue is long, the flow is toxic, or your signal says the price is leaving. "When exactly to stop being patient" is a tactics question — pegging cadence, escalation ladders, crossing triggers — which gets its own treatment in Child order execution tactics. The point here is that the input to that decision is queue-conditional value, not the fee table.

Backtesting tiered fees: the VIP-9 bug

The most common fee bug in backtesting is embarrassingly simple: the config says maker_fee=0.0, taker_fee=0.00017 because someone copied the top row of the exchange's VIP table — or the desk's former tier, or the tier the strategy would hold "at scale" — and the strategy trades live at 2/5. Call it the VIP-9 bug.

It is not a small distortion. Take a quoting strategy with a gross capture (spread minus adverse selection) of 2.6 bps per round trip, two maker legs each:

Fee tier Maker fee Net per round trip
VIP 9 0.0 bps +2.6 bps
Mid-tier 1.0 bps +0.6 bps
Base (VIP 0) 2.0 bps −1.4 bps

The identical strategy is a money printer at the tier you backtested and a shredder at the tier you trade. There is no alpha bug to find, no fill-model subtlety — just a scalar in a config file separating the equity curve from its mirror image. And because maker-strategy edges are routinely 1-3 bps per round trip, fee-tier errors are always the same order of magnitude as the edge itself.

Doing it correctly means recognizing that your fee is a path-dependent state variable, not a constant:

from bisect import bisect_right

class FeeEngine:
    """Tiered fees driven by simulated rolling 30d volume. All rates in bps."""
    TIERS = [(0e6, 2.0, 5.0), (15e6, 1.6, 4.5), (50e6, 1.2, 4.0),
             (100e6, 0.8, 3.5), (600e6, 0.4, 2.5), (4e9, 0.0, 1.7)]
    token_discount = 0.90          # e.g. BNB payment: multiply fees by 0.9

    def __init__(self):
        self.fills = []            # (timestamp, notional)

    def _rolling_volume(self, ts):
        cutoff = ts - 30 * 86_400
        self.fills = [(t, n) for t, n in self.fills if t >= cutoff]
        return sum(n for _, n in self.fills)

    def fee(self, ts, notional, is_maker):
        vol = self._rolling_volume(ts)          # tier from PAST volume
        i = bisect_right([v for v, _, _ in self.TIERS], vol) - 1
        rate = self.TIERS[i][1] if is_maker else self.TIERS[i][2]
        self.fills.append((ts, notional))       # this fill counts toward FUTURE tiers
        return notional * rate * 1e-4 * self.token_discount

Five rules make the accounting honest:

  1. Fees accrue per fill event, per side, on filled notional — not per order and not per round trip. A partially filled order pays fees on the filled fragment only; the interaction between partial fills, cancels, and fee accrual is exactly the state machine from Fill simulation, which also supplies the non-fill probabilities the corrected break-even needs.
  2. The tier is endogenous. Your simulated volume determines your simulated tier; sizing the strategy up changes its own fee. A backtest that scales notional 10x must let the tier ladder respond, in both directions.
  3. Start the simulation at the tier you will actually hold on day one — usually base. If the thesis is "profitable at VIP 4," run the ladder as scenarios and report the break-even tier. That tier is a launch requirement with a volume prerequisite attached, not a footnote.
  4. Model token-denominated discounts as positions. If fees are paid in BNB or discounted by staking, the float's mark-to-market belongs in the strategy PnL, not in a different spreadsheet.
  5. Use the cum-fee spread for venue comparison. Following Colliard-Foucault and Angel-Harris-Spatt: the comparable quantity across venues is s+ft(1)+ft(2)s + f_t^{(1)} + f_t^{(2)} for a taker round trip (or with fmf_m for maker legs), never the raw quoted spread. A venue quoting 1 bps wide at 5 bps taker is four times more expensive to cross than one quoting 4 bps wide at 1 bps taker — and screen-spread league tables will rank them backwards.

The decision, restated

Strip the costume off and the maker-taker decision is a small checklist. Know your real fee row — current tier, current discounts, marginal not aspirational. Compute the cum-fee spread per venue and stop trusting screens. Measure conditional markouts from your own fills, bucketed by queue position at fill time, because AA is not in anyone's documentation. Price every resting quote with p(q)(s/2+rA(q))(1p(q))Cmissp(q)\,(s/2 + r - A(q)) - (1-p(q))\,C_{\text{miss}} and cross without sentiment when it goes negative. Treat rebates as wages for writing options and ask who is exercising. And in the backtest, make the fee a state machine, not a scalar.

The fee schedule tells you what the average counterparty pays the venue for immediacy. Your markouts tell you what the market actually pays you for providing it. Only one of those numbers is about you — trade on that one.

Disclaimer: The information provided in this article is for educational and informational purposes only and does not constitute financial, investment, or trading advice. Trading cryptocurrencies involves significant risk of loss.

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Stay Ahead of the Market

Subscribe to our newsletter for exclusive AI trading insights, market analysis, and platform updates.

We respect your privacy. Unsubscribe at any time.