Why are bitcoin fees so high and what to do about it

An unfortunate predicament for Bitcoin is that newcomers don’t have a technical background or invested time familiarizing themselves with the technology. Of course, why should they?

Cryptocurrency is money, and people should be able to use it without understanding its inner workings. That was the case for some time, before cryptos skyrocketed in popularity and with them the transaction fees, particularly for bitcoin and ethereum transactions.

The fees situation

At the time of writing, the fastest and cheapest transaction fee is 490 satoshis/byte, meaning that the median transaction size of 226 bytes results in a fee of 110,740 satoshis or 15$. (If you didn’t understand anything, this is normal, and I will explain how this is calculated in the next section).

For those of us that are not transferring thousands of dollars worth of bitcoin but would like to use it for small transactions (I used to order Pizza and pay for it in Bitcoin), these fees make Bitcoin unusable at the moment.

There are certain reasons why this is happening, and I will list them below, but to cut to the chase, I don’t recommend using Bitcoin for transferring small amounts at the moment. Bitcoin Cash, ZCash, or Litecoin work just fine and make more sense right now to facilitate these types of transactions. But if you still need to transact in Bitcoin or move funds between your accounts, then this guide is for you.

How are bitcoin fees calculated, the transaction size, and why do we measure it in bytes?

First of all I think it’s important to understand why transaction fees are so high at the moment.

The most important thing to note is that your transaction size is not related to the amount of money you are sending. For example, If your transaction is 250 bytes, you’ll have to pay the same fee whether you’re transferring 0.001 bitcoins or 1 million bitcoins.

Bitcoin is a blockchain-based asset. Every new bitcoin transaction is broadcasted to the network and eventually collected into blocks of 1Mb in size that is included in the blockchain by the miners. An important thing to notice is that since we’re using the blockchain, any new bitcoin transaction typically references previous transaction outputs as new transaction inputs and dedicates all input Bitcoin values to new outputs. Simply put, an input is where the coin value is coming from (usually a previous transaction’s output) and an output where the value is going to. Outputs from one transaction can be used as inputs in a new transaction, creating a chain of ownership as the value is moved from address to address on the blockchain.

An illustration from “Mastering Bitcoin” by Andreas Antonopoulos. Published by O’Reilly.

The thing is that the more small amounts (inputs) of bitcoin you accumulate to your account over time, the bigger is going to be the transaction size when you decide to send (output) these bitcoins to another address.

Below you can see two examples that illustrate this case:



In the first example, someone received a transaction (just one input) and then sent this bitcoin to some other address. This whole transaction is 225 bytes in size.

In the second case, the person received 17 different transactions over time and then decided to send this bitcoin to some other address. Since in the blockchain, “any bitcoin transaction typically references previous transaction outputs as the inputs for the new transactions, the bitcoin network has to process all these many inputs to produce these few outputs, and the resulting size of the transaction is 10X more at 2584 bytes (2.5kb!).

Since each block in Bitcoin’s blockchain is being validated roughly every 10 minutes and has limited space (1MB), it would mean that many smaller transactions would have to wait for this transaction to be included in the blockchain. And since the bitcoin miners can include a finite amount of transactions in each block, they will inevitably prioritize the transactions with the highest fee. Because of this, with today’s standards, for this second transaction to go through would require a fee of around 150$, independently of the value it represents!

How to find the ideal fee for your transaction

The ideal fee depends mainly on two factors: network congestion when you plan to move your bitcoin and the size of your transaction in bytes. Unfortunately, many wallets don’t tell you the size of your transaction before you send it, but fortunately, some others give you the option to specify the fee-per-byte you are willing to use.

In the end, it comes down to the wallet that you use, so make sure to do your research before receiving any bitcoin to your address. Personally, I believe that the 3 most important features in a bitcoin wallet are to use SegWit addresses, the flexibility to adjust your own fees, and finally, the freedom to export your private keys.

Pro tip:

Although most wallets don’t tell you the size of your transaction in bytes, many allow you to specify a custom fee based on how many satoshi/byte you want to spend and give you the total fee based on that value.

Warning: be careful, as some wallets only let you enter the number of satoshis/byte or bitcoins/kilobyte. If you enter the fixed fee described above into a per-byte field, you’ll probably pay more than 200 times more fee than necessary! The good thing is that most wallets should also display that value in USD.

Before making a Bitcoin transaction, here’s what to do to save on fees:

1. Use  bitcoinfees.earn.com

Before I make a transaction, I always visit bitcoinfees.earn.com to check the state of the network. On the right, you can see the time estimations for the average transaction to go through, based on the range of the fees-per-byte (satoshi per byte) on the left. The bars represent the number of competing transactions included in a block. Generally speaking, if you want to have the fastest possible confirmation at the fairest price, go with the recommended satoshi per byte fee. Otherwise, you can experiment (for example, when you are transferring bitcoin between your own addresses) and use lower fees based on the confirmation time estimations on the right and how many other transactions with the same fee range are competing for being included in a block.

If your wallet doesn’t provide any info about your transaction’s size or allows you to select a custom fee per byte but allows you to specify a different fee in USD than the default one, you can again use bitcoinfees.earn.com to calculate the optimal transaction fee. For example, if the recommended fee on earn is 110 satoshis/byte and the median byte size is 226 bytes, 226 * 110 = 24860 satoshi. Use that, and unless you have a considerable transaction size, you should be good to go.

2. Use SegWit

Always use a wallet that supports SegWit addresses and send money to people with SegWit addresses. SegWit transactions are around 75% smaller in size than non-SegWit transactions, and this can have a huge impact on your transaction’s size in bytes and, subsequently, your transaction fees. It’s not easy to tell which address is a SegWit address, but it’s definitely easier though to know which wallets support it.

For those wallets that support it, these will be the default addresses generated by these wallets, so you don’t have to do anything to use SegWit to reap all the benefits that come with it.

Also, I would recommend monitoring bitcoinfees.earn.com during the weekend and use an opportunity when the mempool is quiet to move any bitcoin you might own to segwit addresses. If you bought bitcoin on Coinbase, for example, or any other major exchange, it’s almost certain that your bitcoin lives in a legacy address.

Here’s a few of my favourite Bitcoin wallets that support SegWit:

  • Bitcoin core (desktop wallet)
  • Trezor (hardware wallet)
  • Ledger (hardware wallet)
  • Green Address – mobile wallet (hot wallet)
  • Samurai wallet – Android only (hot wallet)

Before moving on, I’d like to add that it’s darn difficult to find mobile wallets that support segwit at the moment. Most of the hardware and desktop wallets (ex. Electrum) support Segwit but not many in the mobile space. I think this is an oxymoron since most users will use a hot/ mobile wallet for small transactions where the fees are devastating. On a different note, if you haven’t heard of Green Address, the team was recently acquired by Blockstream, and Green Address is now officially a Blockstream product. This proves its legitimacy, and probably I’ll start using it as a hot/ mobile wallet from now on.

3. Do batching

Since the early days of the bitcoin client, it has been possible to combine multiple bitcoin payments into a single transaction, significantly reducing overhead. Making one transaction that pays from one address to many is a simple function that can save you a lot of money since the cost of adding an output to a transaction is much lower than the cost of adding an input (making a whole new transaction).

A number of wallets support batching, most notably:

  • Trezor
  • Electron desktop wallet
  • Samurai
  • Bitcoin core CLI wallet

I am not aware of any other mobile wallet except Samurai supporting batching at the moment.

4. Use a wallet that supports Replace-By-Fee

Basically, wallets that support Replace-By-Fee allow you to assign a variable fee to your transaction, so if you see that the transaction doesn’t get through fast, you can selectively pay more. This allows you to experiment with lower fees and adjust as needed in case of a sudden surge etc.

Replace by fee is supported in:

  • Samurai
  • Electrum
  • Bitcoin core CLI wallet

I am not aware of any mobile wallets except Samurai offering this function right now, and even most desktop wallets don’t, as it’s not a popular feature. The difficulty in its implementation is mainly due to the UX design implications that most wallet developers tend to avoid. It’s no common secret that UX sucks in this field, and there many more talented backend or low-level developers than UI/ front-end developers in the space. Hopefully, great products in the space like Samurai will set the market standard. We’ll start seeing more wallets, especially mobile wallets offering such batching, replace-by-fee, and full fee customization.

5. Do you really need to have a transaction validated asap?

Some providers (ex. BitPay) will wait for at least 1 confirmation because they don’t want to risk double-spending. This sucks, mainly because you’ll need to include a high fee (since you want your transaction to be included in a block asap). Otherwise, you are risking waiting several minutes for your pizza order to be placed which is nothing to mess up with. Moreover, I believe that BitPay hasn’t implemented segwit yet, so these fees are much more expensive than they should be.

But in many other cases when you don’t necessarily need a transaction to happen on time, it just doesn’t make sense to include high fees; for example, when paying contractors for services or moving funds between your accounts, from cold storage to your hot wallets, etc. These transactions will eventually get through, and even if they don’t, you can try again anytime.

What to expect in the future

Perhaps the most important reason why fees are increasing is that most wallets and users alike tend to inflate them. For a wallet developer, it’s easier to suggest a high fee that offers a better user experience than confuse new users with more options and user flows. I follow the wallet closely, and this situation doesn’t seem to change for now, although there’re some promising projects in space (suggested fees based on machine learning, etc.)

Also, right now, only 12% of the transactions on the network are segwit transactions. As more wallets and exchanges start to implement segwit, the fees will decrease. However, since their implementation roadmaps are in many cases unclear, the burden to find a segwit compatible wallet will still fall to the user.

Finally, the lighting network is expected to be implemented in bitcoin in 2018. However, it’s still unclear if the big exchanges will embrace and rip the benefits of the low fees for their user base because of its privacy characteristics that conflict with their “know your customers” regulations and operational framework.