Lightning Node Profitability & Portfolio History Reports | Clams v1.1.0
Clams v1.1.0 adds two reports: Lightning node profitability with per-channel yield, and portfolio history with holdings, fiat value, and cost basis over time.
TL;DR: Clams v1.1.0 ships two new reports. clams reports lightning-pnl tells you whether a Lightning node is paying for itself, down to the channel. clams reports portfolio-history charts your holdings, portfolio value, and open cost basis over time.
Lightning Node Profitability Report
Back in May we walked through measuring node profitability from the raw records: pull the forwards, pull the pays, pull the channel transactions, join them by channel and add it up. That post was clear that Clams did not ship a one-command profitability report. Now it does.
The report is scoped to one Lightning connection and one UTC range. --connection takes a connection's label or its UUID. With no range, it covers everything from the connection's first entry to the latest processed snapshot, so run clams journals process first.
clams reports lightning-pnl --connection routing-node
Lightning Node Profitability
Connection: routing-node
Period: 2024-05-21 17:28:56 UTC to 2026-09-16 14:35:04 UTC (end exclusive)
Node performance
Net result 38,148,279.415 sats
Annualized yield 1.60%
Average capital 1,024,300,000.000 sats
Routing income 44,704,887.415 sats
Liquidity fees 6,432,346.000 sats
On-chain fees 124,262.000 sats
Note: the profitability figures in this section are for information purposes only. They do not represent the output of an actual Lightning node.
Net result is routing income minus liquidity fees minus on-chain fees. Liquidity fees are the routing fees you paid on rebalances, meaning payments that circled back to your own node. Ordinary outgoing payments and inbound liquidity bought from an LSP are not included. On-chain fees are channel open, close, and sweep fees, not your wallet's whole fee history. Yield is that net over average locked capital, annualized. This node cleared about 38 million sats on roughly 10 BTC of capital: 1.6% after every cost.
Add --channels and the report attributes income and costs to each channel, using the node's own channel evidence.
clams reports lightning-pnl --connection routing-node --channels
Channel performance
Amounts in sats; yield is annualized.
Channel State Avg capital Income Costs Net Yield
7e3a91c04b5d:0 open 198,412,050.000 9,842,110.215 1,426,012.000 8,416,098.215 1.83%
2c8f5d1a9e70:0 open 161,003,377.210 7,910,458.900 1,121,035.000 6,789,423.900 1.82%
f14b6e2d8a93:0 open 124,750,000.000 6,288,212.300 895,300.000 5,392,912.300 1.86%
a95c07e3d1f6:0 open 105,209,914.882 5,102,876.410 726,733.000 4,376,143.410 1.79%
d60e8b4f2c17:0 open 97,880,240.000 4,611,790.600 654,816.000 3,956,974.600 1.74%
38b2d9f6e0a4:0 open 91,266,805.550 3,940,655.140 606,925.000 3,333,730.140 1.57%
c7d1a3e58f29:0 closed 86,104,020.000 3,473,310.900 427,186.000 3,046,124.900 1.52%
e2f5b8a0c463:0 closed 69,900,000.000 1,302,918.750 355,940.000 946,978.750 0.58%
5b9e3c7a1d82:0 open 50,410,884.760 1,274,202.500 199,590.500 1,074,612.000 0.92%
5b9e3c7a1d82:1 open 39,362,707.598 958,351.700 143,070.500 815,281.200 0.89%
Use --format json for full channel IDs and structured report fields.
Each row is a channel keyed by its funding outpoint. The last two rows share a funding transaction: two channels opened in one batch, with that transaction's fee split equally between them. The same command runs against an LND connection.
Pass --start and --end to measure a window. Here is the same node across calendar 2024 alone:
clams reports lightning-pnl --connection routing-node --channels \
--start 2024-01-01T00:00:00Z --end 2025-01-01T00:00:00Z
Period: 2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (end exclusive)
Node performance
Net result 6,923,291.210 sats
Annualized yield 1.50%
Average capital 461,206,377.115 sats
Routing income 8,118,655.210 sats
Liquidity fees 1,131,908.000 sats
On-chain fees 63,456.000 sats
Income and costs count only what settled inside the window, and average capital is measured across it.
The report is honest about what it cannot see. If on-chain fees cannot be attributed to a channel, the report prints n/a for yield instead of a number computed on partial costs, and counts the unattributed candidates. If channel history is incomplete, the affected rows are marked with their limitations rather than silently rolled into the total. The --format json flag exposes all of it, including full channel IDs and peer node IDs, for scripting.
Portfolio History Report
The balance sheet tells you what you hold today. Portfolio history tells you what you held at every point in between, what it was worth, and what you paid for the BTC you still have.
The default invocation charts fiat portfolio value at a monthly interval over the whole life of the profile:
clams reports portfolio-history
Portfolio History
-----------------
Snapshot: 2026-09-16T14:35:04.799+00:00
Finality: final
Interval: month
Range: 2024-05-21T17:28:56+00:00 to 2026-09-16T14:35:04.799+00:00
Portfolio value (USD) (portfolio_value:fiat:USD)
Unit: USD fiat (scale 3)
Latest: 0.000 USD at 2026-09-16T14:35:04.799+00:00 Values: 30 Gap values: 0
Range: 2024-05-21T17:28:56+00:00 to 2026-09-16T14:35:04.799+00:00
▅█▇▆▆▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
Three metrics are available: asset_balance, portfolio_value, and btc_open_cost_basis. Portfolio value can be denominated in fiat, in BTC, or both. Pick a range and an interval of hour, day, week, or month. This is the same profile over the months the node was active, sampled weekly:
clams reports portfolio-history \
--metric asset_balance,portfolio_value,btc_open_cost_basis \
--portfolio-denomination fiat --portfolio-denomination btc \
--start 2024-05-01T00:00:00Z --end 2024-12-31T23:59:59Z --interval week
Portfolio History
-----------------
Snapshot: 2026-09-16T14:35:04.799+00:00
Finality: final
Interval: week
Range: 2024-05-01T00:00:00+00:00 to 2024-12-31T23:59:59+00:00
BTC balance (asset_balance:01a0aaa4-681b-75b7-9161-3c3dcf737a88)
Unit: BTC sats (scale 3)
Latest: 0 SATS at 2024-12-31T23:59:59+00:00 Values: 37 Gap values: 0
Range: 2024-05-01T00:00:00+00:00 to 2024-12-31T23:59:59+00:00
▁▁▁▁█████████▆▆▆▆▆▆▆▆▆▆▁▁▁▁▁▁▁▁▁▁▁▁▁▁
Portfolio value (USD) (portfolio_value:fiat:USD)
Unit: USD fiat (scale 3)
Latest: 0.000 USD at 2024-12-31T23:59:59+00:00 Values: 37 Gap values: 0
Range: 2024-05-01T00:00:00+00:00 to 2024-12-31T23:59:59+00:00
▁▁▁▁████▇▇▆▇█▆▅▆▆▆▅▅▆▆▆▁▁▁▁▁▁▁▁▁▁▁▁▁▁
Portfolio value (BTC sats) (portfolio_value:btc)
Unit: BTC sats (scale 3)
Latest: 0 SATS at 2024-12-31T23:59:59+00:00 Values: 37 Gap values: 0
Range: 2024-05-01T00:00:00+00:00 to 2024-12-31T23:59:59+00:00
▁▁▁▁█████████▆▆▆▆▆▆▆▆▆▆▁▁▁▁▁▁▁▁▁▁▁▁▁▁
BTC open cost basis (USD, FIFO) (btc_open_cost_basis:USD:FIFO)
Unit: USD fiat (scale 3)
Latest: 0.000 USD at 2024-12-31T23:59:59+00:00 Values: 37 Gap values: 0
Range: 2024-05-01T00:00:00+00:00 to 2024-12-31T23:59:59+00:00
▁▁▁▁█████████▆▆▆▆▆▆▆▆▆▆▁▁▁▁▁▁▁▁▁▁▁▁▁▁
Read the four charts together. The sat balance steps down as channels close and fees are paid. The USD value moves with the price on top of that. The open cost basis tracks the balance chart, not the USD chart: it moves only when you acquire or dispose, never when the price does. --fiat-currency switches the fiat side to another currency.
The sparklines are for a quick read in the terminal. For a dashboard or a spreadsheet, --format json returns the timestamp array and one value per series per timestamp, each carrying its own gap flags, so you know exactly where price or balance evidence was missing.
Also in this release
A license and profile capacity can now be transferred to a replacement installation, even when the old one is gone. Workspace members get display names and verified emails, managed through clams context identity. Journal event lists in JSON, YAML, and the API now carry per-asset balance changes.
On the fixes side, Core Lightning and LND channel balances and mining fees are corrected across force closes, recovered funds, and fees shared between channels. Full-sync crashes and intermittent macOS database errors are fixed, connection deletion now cleans up properly, and TLS dependencies are updated for an upstream advisory. The complete list is in the v1.1.0 release notes.
Update
clams update
macOS builds now require macOS 11 or newer, and on macOS you should stop every running Clams process before upgrading. The Lightning fixes above touch historical data, so with each profile that has a Core Lightning or LND connection selected, run a full resync:
clams connections sync --all --force-full-sync
clams journals process
clams journals quarantined
Review anything left in quarantine before relying on the new reports.
Run into issues? Use clams feedback or reach out at support@clams.tech.
Clams Team