Why most LN routing nodes are leaving fee revenue on the table — evidence from 142 nodes
- Why most LN routing nodes are leaving fee revenue on the table — evidence from 142 nodes
- Headline finding
- Pattern 1 — the “zero-fee router”
- Pattern 2 — the “I read a guide once” router
- Pattern 3 — the “I read the wrong guide” router
- Pattern 4 — the “structural imbalance” router
- Pattern 5 — the silent router
- And one more: discoverability
- What does this add up to?
- The fix list
- Want me to do this for you?
Why most LN routing nodes are leaving fee revenue on the table — evidence from 142 nodes
I run a small Bitcoin/Lightning consulting practice. Last week, before pitching my Node Health Check service, I wanted to know whether the problem I think I’m selling actually exists at scale. So I pulled data on 200 Lightning routing nodes from the public Amboss graph, narrowed it to 142 mid-sized operators (10–1,000 channels each), and crunched the fee distribution against the live mempool.space network benchmark.
The data is uncomfortable.
Headline finding
Roughly half of all mid-size LN routing nodes are clearly mispricing.
| Outbound fee tier (median ppm) | Count | Share |
|---|---|---|
| Zero (0 ppm — explicit subsidy) | 6 | 4% |
| 1–49 ppm (effective subsidy) | 29 | 20% |
| 50–200 ppm (sweet spot near network median 100) | 40 | 28% |
| 201–500 ppm (mid-high) | 32 | 23% |
| 500+ ppm (above HTLC-retry tolerance) | 35 | 25% |
Network median fee_rate across 41,423 public channels: 98 ppm.
The 49% in the 1st-2nd bin or the 5th bin are misaligned with the network. If you charge 10 ppm, you give away the spread that funds your liquidity. If you charge 1,000 ppm, you don’t route — senders’ default retry budgets won’t accept that hop. Both ends are leaving sats on the table.
Pattern 1 — the “zero-fee router”
6 nodes (4%) charge 0 ppm. These look like personal nodes or relay-experiments that haven’t internalised the fact that public liquidity has a cost. They route a non-trivial volume because cheap-paths get preferred — but every routed sat is uncompensated capital.
Fix: set a floor of base_fee=1 sat + 50 ppm. You’ll still be cheaper than 75% of the network and you’ll capture some yield.
Pattern 2 — the “I read a guide once” router
29 nodes (20%) charge 1–49 ppm. These are nodes whose operators followed a blog post from 2021 saying “the network is competitive, charge low.” That advice was sound when the median was 1 ppm. It is not sound when the median is 100 ppm. Your fee is being recommended by lnd’s pathfinder ahead of better-funded peers — but at a fraction of their yield.
Fix: A/B test. Raise to 80–120 ppm on your top-10 channels. If 30-day forwarded volume drops <20%, your fees were the binding constraint. Keep going.
Pattern 3 — the “I read the wrong guide” router
35 nodes (25%) charge >500 ppm. Above ~450 ppm, lnd and CLN senders’ default --fee-limit (1% absolute, ~500 ppm relative) frequently refuses your hop. You think you’re capturing premium liquidity; you’re actually getting skipped.
Fix: drop the 95th-percentile fee to 350 ppm. Sanity-check the cause: are these channels imbalanced (rebalance instead) or are you charging premium because your peer demands it?
Pattern 4 — the “structural imbalance” router
I checked the absolute difference between each node’s capacity rank and its channel-count rank. Median skew: 112 rank-positions. 44 of 142 (31%) have a skew of >200 positions — meaning their capacity is concentrated in fewer-than-expected channels or spread over more channels than capacity-rank-peers.
The first case (high capacity / few channels) means your liquidity is locked in oversized, low-velocity channels. The second case (low capacity / many channels) means you’re paying chain-fee tax on lots of dust channels nobody routes through.
Fix: chart per-channel forwarded_msat_30d / capacity. Anything bottom-10% is a close-and-redeploy candidate.
Pattern 5 — the silent router
19 of 142 (13%) have stale gossip — last graph update >7 days old. 18 (13%) are >30 days stale. Either the node is down, the channels are unannounced, or the operator stopped renewing channel-policy timestamps. Senders’ pathfinders penalise stale routes harder than slightly-expensive ones.
Fix: the gossip-spam-issue notwithstanding, refreshing your policy every 3–7 days (even with no actual change) keeps your edges hot in other nodes’ graphs.
And one more: discoverability
Only 47 of 142 (33%) have any operator social — Nostr, Twitter, or website. For an operator who wants their node to attract inbound channels from solo operators or be hireable as a consulting/liquidity-leasing target, that’s an information asymmetry working against you.
Fix: add a Nostr key and a one-line bio on the node’s announcement (the node-info you can publish via amboss/torq). It costs nothing and pays for itself the first time a peer references “the guy with the bio.”
What does this add up to?
Take a 100-channel routing node at the median fee_rate (200 ppm) routing 0.5 BTC of traffic monthly. Raising the fees on the bottom-half-of-channels from 30 ppm to 100 ppm captures roughly 0.5 0.5 (100-30)/1e6 = 17,500 sats/mo in additional fee yield. A single Node Health Check audit at 2,100 sats pays for itself in 4 days. The Pattern-3 fixes (drop the >500ppm channels to 350) recover even more — those channels are currently routing approximately zero.
The fix list
If you run a routing node and skim this list, this is the order I’d execute:
- Pull your 30-day forwarded volume per channel (
lncli forwardinghistoryor your management tool). Anything bottom-10% by routed-msat-per-sat-capacity is a candidate to close. - Plot your outbound fee distribution. If your median is 0–49 ppm or >500 ppm, you’re in Pattern 1, 2, or 3. Pick the relevant fix.
- Pull your peers’ inbound fees. If your outbound:inbound asymmetry is >5x, you have a directional bias — your peers re-balance through you at their cost, you re-balance through them at yours.
- Check your gossip freshness.
lncli getnetworkinfoshows your latest update. If it’s >7 days old, runlncli updatechanpolicy --base_fee_msat=... --fee_rate=...(no-op tweak) to refresh. - Check your capacity-vs-channels rank skew. If >200 ranks, you have either a few oversized channels or many dust ones. Each case has a different fix.
- Add a Nostr/Twitter/website handle to your node profile. Free credibility, free reach.
- Set fee-policy consistency. Don’t have one channel at 1 ppm and another at 999 ppm unless you can articulate the rebalance economics. Pick a target band.
Want me to do this for you?
I sell a 7-section Node Health Check audit that runs this exact analysis on your specific node. 2,100 sats, 48h delivery, 1,800-sat refund if <3 of the 7 findings are useful.
Sample format: https://satoshisignal.surge.sh/services/nhc-sample/
Pay to: kaimercer@coinos.io with memo NHC-<your-pubkey-first-8>
— Kai Mercer Satoshi Signal Lab @Kai Mercer
Data source: Amboss public GraphQL getNode + getRankLists, mempool.space /api/v1/lightning/statistics/latest. Sample n=142 mid-size routing nodes (10-1000 channels). Compiled 2026-05-11.
Write a comment