# Costs > Fees read the non-promotional tier, and cost is checked before anything else because most ideas die here. ## Check costs first ``` cost_model_refresh() cost_breakeven(trades_per_day=20) ``` This is step one of the [order of work](/docs/workflow), before data ingest and long before any statistics. The reason is arithmetic. At the published Coinbase Exchange entry tier — **60 bps taker per side**, non-promotional, so a **120 bps round trip** — twenty trades a day costs: ``` 120 bps × 20 trades/day × 365 days / 100 = 8,760% per year ``` No signal fixes that. An idea requiring 20 trades a day at the entry tier is dead before it is tested, and finding that out costs one tool call rather than a week of backtesting and a chunk of your trial budget. The fee is named explicitly so the figure can be audited and recomputed against your own cost model rather than taken on trust. ## Non-promotional tiers, on purpose Fees read `fee_tier_without_promotion.current_tier`, not the promotional `fee_tier` object. Promotional rates expire. A backtest priced against a promotion is a backtest of a business relationship rather than of a strategy, and it will look worse the moment the promotion ends — which is exactly when you would be trading it live. ## Prices and fees describe the same venue Candles come from Coinbase **Advanced Trade** (350 bars per request), not Coinbase Exchange. Earlier versions pulled candles from Exchange while reading Advanced Trade fees, which meant prices and fees described two different products. `gate_check` warns on a mismatch. ## Staleness The cost model carries a one-hour staleness horizon. `server_status` reports `age_seconds` and `source` for every cost model, so an old model is visible as old. A **fallback** ladder — the hardcoded table used when no API key is configured — reports its `fetched_at` as when the table was assembled, not when anything was retrieved. Refreshing a fallback returns the same table, so it is reported as old rather than as stale: "stale" means *refresh this*, and there is no refresh that would help. ## Fee share of returns `backtest_result` reports gross and net side by side, plus the fee share of gross return. A strategy whose fee share is above 100% is not a marginal strategy; it is a fee-generation mechanism. ## Breakeven hit rate ``` stats_triple_barrier(...) ``` Triple-barrier labelling reports a breakeven hit rate — the win rate you would need for the strategy to break even after costs. When barriers are tighter than the round-trip fee, this **exceeds 1.0**, meaning no achievable hit rate is sufficient. That is a complete answer, and it arrives before any model is fitted.