Solana Priority Fees: Landing Transactions Under Load
A practical breakdown of dynamic compute-unit pricing and fee estimation so your Solana bot lands transactions without overpaying during peak congestion.
Solana's reputation for speed is real — but that speed is shared among thousands of bots, MEV searchers, and retail traders all competing for the same block space. When a token launches, a liquidation cascade hits, or a new Jito bundle opportunity surfaces, the network clogs and your transaction sits unconfirmed while someone else prints. Understanding priority fees at the mechanical level is the difference between a bot that consistently lands and one that bleeds latency losses.
How Compute Units and Priority Fees Actually Work
Every Solana transaction consumes compute units (CUs) — a measure of the raw CPU work the validator performs to execute it. The base fee is fixed and negligible, but the priority fee is set by you: it is a microlamport-per-compute-unit bid that signals to validators how urgently your transaction should be scheduled.
The formula is straightforward:
total priority fee (lamports) = (microlamports per CU × requested CUs) / 1,000,000
The trap most bots fall into is requesting the default CU limit (200,000) even when their instruction only needs 40,000. You pay for the ceiling you declare, not what you burn. Always simulate your transaction first — via simulateTransaction or a local replay — and set the CU limit to actual consumption plus a 10–15% safety buffer. This alone cuts priority fee spend significantly on any program that is light on compute.
Dynamic Fee Estimation: Reading the Mempool in Real Time
Solana does not have a traditional mempool, but validators do maintain a local transaction queue. The getRecentPrioritizationFees RPC method returns a rolling window of fees paid for recent slots, broken down by program address. Querying this for your target program — a DEX, a lending protocol, a perps venue — gives you a percentile distribution of what bids are actually clearing.
A well-built bot:
- Pulls fee samples every 2–3 slots from multiple RPC endpoints (staleness kills accuracy)
- Picks a percentile dynamically: 50th during quiet periods, 90th+ when slot utilisation is elevated
- Monitors slot timing — if slots are taking longer than ~450 ms, congestion is active and you should step up the bid
- Applies a hard cap so a fee spike in an illiquid market cannot drain the wallet
For latency-critical flows like sniping or cross-venue arbitrage, subscribing to a Geyser stream (via Yellowstone gRPC or a commercial provider) lets you observe block production and account state changes in near real time, so your fee estimation reacts to network conditions before they appear in lagging RPC responses.
Jito Bundles and the Tip Auction Layer
Priority fees set your place in the validator's local queue, but Jito bundles operate on a separate layer. When you submit a bundle to a Jito block engine, you are paying a tip (in SOL, separate from priority fees) to have your ordered set of transactions included atomically at a specific position in the block. This matters for:
- MEV-sensitive trades where sandwich risk is real
- Liquidation bots that need atomic check-and-execute
- Any strategy where partial execution is worse than no execution
Tips and priority fees stack — you need both. The Jito tip market has its own percentile distribution, accessible via the Jito tip floor API. Your bundle logic should read this, bid the 75th–90th percentile during competitive events, and fall back to non-bundle submission when tip costs exceed the trade's expected PnL.
Our Solana sniper bot uses exactly this dual-auction approach: it reads real-time slot utilisation from a Geyser subscription, sets CU limits from pre-simulated instruction profiles, and switches between bundle and standard submission paths based on a live tip-to-PnL ratio check. Landing rate under load improved materially once the estimation layer stopped using stale static values.
Putting It Together in Production
A reliable fee strategy has three layers working together:
- Estimation — live percentile sampling from
getRecentPrioritizationFeesfiltered to your target program, refreshed every slot - Simulation — accurate CU profiling per instruction set so you never over-request compute
- Submission routing — dynamic choice between Jito bundle (when tip is justified) and standard transaction, with fallback retry logic that escalates fees on confirmation timeout
Kill-switches matter here too. If your fee escalation logic has a bug, a stuck retry loop can drain lamports in seconds. Cap the maximum tip and priority fee absolutely, and wire a circuit breaker that halts submission if spend-per-minute crosses a threshold.
Building this infrastructure correctly takes time — especially when you are also managing inventory skew, funding rate exposure, or CLOB order book state on top of it. If you want it done without the iteration cost, our trading-bot services cover the full stack from fee estimation to execution routing to monitoring dashboards.
Ready to build a Solana bot that lands reliably under load? Start a project with TierZero and we will scope the fee strategy alongside the rest of your execution architecture.
Need a bot like this built?
We design, build and run trading bots on Solana, Hyperliquid and Polymarket.
Start a projectMore from the blog
Public vs Paid RPC: How to Run a Fair Benchmark
A fair comparison of public and paid RPC endpoints must account for quotas, workload, freshness and support guarantees.
Read articleRPC Benchmark Percentiles Explained: p50, p95 and p99
Why averages hide the latency spikes that break trading bots, wallets and production blockchain applications.
Read articleHyperliquid REST vs WebSocket Benchmark: What to Measure
A benchmark plan for Hyperliquid market data that separates request latency from streaming freshness and recovery.
Read article