Inbound fees and the liquidity ladder.
June 2026
Outbound pricing and rebalancing assume one thing: that a depleted channel is
worth refilling. Some aren't — paying for a circular rebalance into a channel
that earns less than the refill costs is a guaranteed loss (the
profitability gate is what catches it).
The inbound-fee layer is what the node does instead: discount
the inbound side to pull an organic refill for free. It is an optional layer,
gated by INBOUND_FEE_ENABLED; this note answers how it works.
What is a negative inbound fee?
LND (0.18+) lets a channel charge a fee on the incoming side of a forward, not just the outgoing side. The total a forwarder pays through a hop is the sum of the outbound fee on the channel sats leave by and the inbound fee on the channel they arrive by. A negative inbound fee is a discount: it subtracts from that sum, making routes that refill your depleted channel cheaper than they'd otherwise be. Crucially, negative inbound is backward-compatible — a sender that ignores the field simply doesn't get the discount; nothing breaks.
Why discount inbound instead of just rebalancing?
Because a circular rebalance costs real sats and an inbound discount costs nothing unless someone actually routes. When refilling isn't worth a paid rebalance — the channel is flagged structural, or there's simply no overfull source to pull from — a negative inbound fee turns the rest of the network into your rebalancer: anyone routing a payment that happens to refill you gets a cheaper hop and takes it. It is a rescue subsidy, not a standing price, and unlike raising fees it doesn't price out the very demand you want.
How big is the discount?
Largest when the channel is most depleted, tapering linearly to zero as it recovers, and capped so it can never make a forward free:
frac = 1 − local_ratio / INBOUND_DISCOUNT_CLEAR_RATIO # 1.0 at 0%, 0.0 at 0.35
raw = INBOUND_DISCOUNT_MAX_PPM × frac # up to 200 ppm
cap = max(0, outbound_ppm − INBOUND_DISCOUNT_SAFETY_MARGIN_PPM) # margin 10
inbound = −round( min(raw, cap) ) # ≤ 0
The taper means the discount engages only below CLEAR_RATIO (0.35,
"out of danger" — not a full refill to 50%) and fades to nothing as the channel
climbs back. The cap is the important guard: the discount is never allowed to
exceed your own outbound fee minus a small margin, so the summed forward
fee on a same-channel route stays positive — you never pay someone to route
through you. LND's forward-time check is the cross-channel backstop for the same
invariant.
What's the full decision ladder?
decide_channel_action picks exactly one action per channel per run,
in this order:
local < 20% (depleted):
not structural AND an overfull source exists → rebalance (let the planner refill)
else, defended < window → inbound_discount (pull organic refill)
else, defended ≥ INBOUND_DEFENSE_WINDOW_DAYS → flag_structural (capital decision)
20% ≤ local < 35% AND already discounting → inbound_discount (keep tapering off)
local > 80% AND INBOUND_CHARGE_PPM > 0 → inbound_charge (off by default)
otherwise → none (healthy) So inbound discounting only runs once a paid refill has been ruled out. The taper-band rung (20–35%) exists so a channel that's recovering keeps easing the discount off rather than dropping it abruptly — and it only applies if the channel was already being discounted, so a channel that rose into that band via a normal rebalance or balanced flow is never handed a discount it didn't need.
When does the node give up and flag structural?
When the discount has run the whole INBOUND_DEFENSE_WINDOW_DAYS (14)
without the channel recovering. That's the signal that organic demand to refill
this channel simply doesn't exist, so no amount of pricing fixes it — it becomes
a capital decision (splice in, open more inbound, or close), and the node stops
spending on it.
How is the inbound fee broadcast?
It has to clear INBOUND_HYSTERESIS_PPM (25) before it re-broadcasts, the
same gossip-damping idea as the outbound side. Manual fee pins keep inbound untouched.