Fee Market and Transaction Strategies
Introduction: Why Fees Matter
Unlike traditional payment networks where fees are often static or hidden, Bitcoin operates on a dynamic fee market:
Fees are determined by supply and demand for blockspace.
Users compete to have their transactions included in blocks.
Fees can fluctuate dramatically over short periods depending on network congestion.
Building a non-custodial Bitcoin wallet means you must account for fee dynamics at every step of your product design .
Poor fee handling destroys user experience during congestion periods.
Core Concepts in Bitcoin Fee Markets
Term | Description |
---|---|
Fee rate | Amount of satoshis paid per virtual byte (sats/vByte). |
Mempool | Waiting area for unconfirmed transactions. |
Block target | Number of blocks in which the user hopes the transaction gets confirmed. |
Replace-by-Fee (RBF) | A Bitcoin protocol feature that allows users to bump the fee of an unconfirmed transaction by creating a replacement transaction. |
Child-Pays-For-Parent (CPFP) | A technique where a new transaction (child) spends from a stuck parent transaction with a high enough fee to "drag" both into confirmation. |
How Fee Markets Actually Behave
Situation | Fee Behavior |
---|---|
Low network activity | 1–2 sat/vByte transactions confirm within a few blocks. |
Medium congestion | 10–20 sats/vByte becomes typical. |
Major congestion (mempool backlog) | 50–200+ sats/vByte needed for fast confirmations. |
Fee spikes (e.g., Ordinals, BRC-20 craze) | 500+ sats/vByte may be required for next-block confirmation. |
During fee spikes:
Cheap transactions get stuck for hours or days.
Users who don't understand fees will panic.
Wallets that handle fee strategies poorly will get bad reviews.
Best Practices for Fee Handling in Non-Custodial Wallets
Offer Fee Options: Fast, Normal, Economical
At send time, allow users to select their preferred speed vs cost tradeoff.
Example UI:
Option | Target Confirmation Time | Est. Fee Rate |
---|---|---|
Fast | Next block (~10 min) | High fee |
Normal | 3–6 blocks (30–60 min) | Moderate fee |
Economy | 6+ blocks (1+ hour) | Low fee |
Use Bitnob's fee estimation API to fetch real-time fee recommendations.
Show Actual Fee Costs in Bitcoin and Fiat
Do not just show users "10 sats/vByte". Instead, calculate:
Estimated total transaction size in vBytes
Total fee in satoshis
Total fee in USD (or user's local currency)
Example:
Transaction Size: 200 vBytes
Fee Rate: 20 sats/vByte
Estimated Total Fee: 4,000 sats (~$1.80)
Show the estimated fee clearly before broadcasting.
Support Replace-by-Fee (RBF)
If a user's transaction gets stuck:
Allow them to bump the fee using Bitcoin's RBF feature.
Present a "Speed up this transaction" option in the UI.
Build your transaction building engine to mark transactions as RBF replaceable
(sequence < 0xffffffff - 1).
This greatly improves user experience during fee spikes.
Consider Child-Pays-For-Parent (CPFP)
In case the wallet spends from a stuck unconfirmed transaction:
Automatically offer a CPFP option where a new transaction pays enough fee to pull both into confirmation.
BDK and advanced libraries can help with CPFP constructions.
Warn About Low-Fee Transactions
If a user tries to send with a very low fee:
Show a warning:
"This transaction may take several hours or days to confirm due to low fees. Proceed anyway?"
Optionally, default users to Normal or Fast unless they explicitly choose Economy.
UX Design for Bitcoin Fees
Designing around fees is not just a technical problem — it’s a UX problem.
UX Mistake | Correct Design |
---|---|
Hide fee settings entirely | Expose user-friendly fee options with clear descriptions |
Show fee rates only in sats/vByte | Show estimated total fee in Bitcoin and fiat |
Panic users with "Transaction stuck!" error | Offer "Speed Up" with RBF automatically |
Force manual re-sending if fees are wrong | Allow easy bumping or CPFP flows |
Fee Behavior in Real World Wallets (Lessons)
Wallet | Fee Behavior |
---|---|
Muun Wallet | Dynamically calculates pre-built CPFP bundles under the hood for invisible confirmation guarantee. |
BlueWallet | Lets users customize exact fee rates manually (advanced mode). |
Phoenix Wallet | Internal "smart" fees and auto CPFP for Lightning channels. |
CashApp | Offers "instant send" fee options backed by high fee prepayments. |
Depending on your user type (consumer, advanced), you can pick whether to auto-handle or expose fine-grained controls .
Mempool Monitoring (Optional Advanced Strategy)
For large wallets:
Monitor Bitcoin mempool via Bitnob (or internal nodes).
Detect congestion.
Adjust fee recommendation presets dynamically.
Example:
If mempool > 300 MB → Adjust Fast fee preset to +20% over normal.
If mempool < 30 MB → Lower default fast fee by -10%.
This dynamic behavior shows professionalism and protects user funds.
How Bitnob Supports Your Fee Strategy
Today:
Bitnob offers dynamic fee estimation API: low, medium, high fee targets.
Allows your wallet to fetch updated fee recommendations before every send.
Future:
Planned support for:
Mempool event webhooks
Fee market monitoring APIs
Enhanced Replace-by-Fee (RBF) helper APIs
CPFP construction templates
You can start simple now — and grow with Bitnob into advanced fee management over time.
Final Thoughts
Fees are not optional details in Bitcoin UX.
They are central to wallet experience and user satisfaction.
Wallets that hide fees, guess wrong, or fail to help users during congestion will quickly lose trust.
Wallets that respect users, explain fees well, and offer real control or intelligent defaults will dominate.
Quick Developer Checklist
✅ Always fetch real-time fee estimates.
✅ Offer Fast, Normal, Economy options at minimum.
✅ Display total fee in BTC and fiat terms.
✅ Support Replace-by-Fee (RBF) if possible.
✅ Plan CPFP flows internally for stuck transactions.
✅ Watch mempool activity to adapt strategies.