LND Fee Management — Set Base Fee and Fee Rate for Routing
LND Debug GuideProblem: How to Set Routing Fees in LND
If your LND node routes payments, fee settings determine how much you earn. Too high and nobody routes through you. Too low and you earn nothing meaningful.
Understanding LND Fee Structure
LND uses two fee components per channel:
- base_fee_msat: flat fee per payment (in millisatoshis)
- fee_rate: proportional fee (parts per million of payment amount)
Total fee = base_fee_msat + (amount_msat * fee_rate / 1,000,000)
Check Current Fees
lncli feereport lncli listchannels | jq '.[].local_constraints'
Update Fees for a Specific Channel
# Update fees for a channel lncli updatechanpolicy \ --base_fee_msat 1000 \ --fee_rate 0.000100 \ --time_lock_delta 40 \ --chan_point TXID:OUTPUT_INDEX
Update Fees for All Channels at Once
lncli updatechanpolicy \ --base_fee_msat 1000 \ --fee_rate 0.000100 \ --time_lock_delta 40 \ --all
Common Fee Strategy Settings
Passive/sink node (cheap, high volume):
--base_fee_msat 0 --fee_rate 0.000001 # 1 ppm
Balanced routing node:
--base_fee_msat 1000 # 1 sat flat --fee_rate 0.000100 # 100 ppm
Premium routing (scarce liquidity):
--base_fee_msat 2000 --fee_rate 0.000500 # 500 ppm
Set Fees via lnd.conf (Default for New Channels)
[Bitcoin] defaultchanconfs=3 [routing] fee.basefee=1000 fee.feerate=100
Monitor Fee Earnings
# View forwarding history lncli fwdinghistory --start_time='1621000000' # See earned fees lncli fwdinghistory | jq '.forwarding_events[] | .fee_msat' | paste -sd+ | bc
Tools for Fee Optimization
- bos (Balance of Satoshis): automated fee management with charge-lnd
- charge-lnd: rule-based automatic fee setting
- RTL (Ride the Lightning): GUI for fee management
- LNDg: analytics and automated fee management
charge-lnd Example Config
[default] strategy = static base_fee_msat = 1000 fee_ppm = 100 [expensive-outbound] chan.min_local_balance = 0.8 strategy = static fee_ppm = 500
Inbound vs Outbound Considerations
LND currently only supports outbound fee setting. Inbound fees (NIP-XXX) are in development. To control flow direction, use fee asymmetry: set high fees on channels you want to discourage routing through.
Troubleshooting: Fees Not Updating
# Verify fee update broadcast lncli describegraph | jq '.edges[] | select(.channel_id=="YOUR_CHAN_ID") | .node1_policy' # Force gossip refresh lncli updatechanpolicy --all --base_fee_msat 1000 --fee_rate 0.0001 --time_lock_delta 40
Fee updates propagate via gossip and may take up to 30 minutes to appear across the network.