Crypto Portfolio PnL Calculation: Proceeds, Basis, Fees, and the Realized Line (2026)

Tax·

Crypto Portfolio PnL Calculation: Proceeds, Basis, Fees, and the Realized Line (2026)

Portfolio PnL is not the number an exchange app shows. Realized PnL is proceeds minus cost basis minus fees on a jurisdiction-correct basis method; unrealized PnL is mark-to-market on holdings. The fee treatment, the realized/unrealized split, and why performance PnL is not the taxable gain.
Author avatar Wag3s TeamEditorial team specializing in Web3 finance, crypto tax, and DAO operations. Based in Zurich, Switzerland.

Reviewed by Wag3s Editorial Team — verified against the realized-PnL = proceeds − basis − fees identity, the realized/unrealized split, and the jurisdiction-specific basis-method dependency · Last reviewed May 2026

Crypto Portfolio PnL Calculation

The profit-and-loss number on an exchange dashboard and the gain you report on a tax return start from the same trades and almost never agree. The dashboard mixes realized and unrealized movement, sees only one venue, and rarely uses the cost-basis method your country requires. Pulling those threads apart is the difference between knowing how your portfolio is doing and knowing what you owe. This article sets out the realized PnL identity, how fees enter it, and why the performance figure and the taxable figure are two distinct outputs of the same history. The basis method that feeds the calculation is jurisdiction-specific and is covered in the cost basis methods pillar; here the focus is the PnL computation itself, not which method your country mandates.

In brief

  • Realized PnL on a disposal is proceeds minus cost basis minus allowable fees, with the basis computed on your jurisdiction's mandated method.
  • Unrealized PnL is the mark-to-market change on positions you still hold: paper performance, generally not taxable for individuals under a realization regime.
  • Acquisition fees raise the cost basis, disposal fees reduce proceeds, and network gas is captured under a consistent, documented policy.
  • The jurisdiction-specific part is the basis method, not the arithmetic, which is why two tools can disagree on the same trades.
  • An exchange app's PnL is a performance indicator, not the taxable gain: it covers one venue, uses a simple running method, and can misread self-transfers.
  • Performance PnL and taxable gain answer different questions and should be computed separately.

The realized PnL identity

For a disposal:

Realized PnL = proceeds − cost basis − allowable fees

The arithmetic is trivial; the cost basis input is not. It must use the method your jurisdiction mandates: US per-wallet FIFO or Spec-ID from 2025, UK Section 104 pooling, German FIFO, Canadian ACB, or French 150 VH bis. Two tools that disagree on the same trades are disagreeing on the basis method, not the formula.

Realized vs unrealized

Realized PnLUnrealized PnL
FromDisposals that happenedPositions still held
TaxFeeds the taxable gainGenerally not taxable (individuals)
UseTax computationPortfolio performance

A portfolio view blends both for performance; a tax computation needs the realized line isolated and on the correct basis method (see realized vs unrealized). Mixing them is the classic "why do I owe tax on a paper gain" confusion.

Fees are not optional

  • Acquisition fees generally increase the cost basis.
  • Disposal fees generally reduce proceeds.
  • Network gas is captured under a consistent, documented policy.

Ignoring fees overstates the gain. They attach to the specific transaction and are never netted away invisibly, the same discipline as reconciliation. The exact deductibility of particular fees can be jurisdiction-specific, so document the policy and confirm the edge cases.

Why the exchange number is wrong for tax

An exchange PnL display is an indicative performance figure, not the tax figure, because it typically:

  • covers one venue only and ignores your other wallets and exchanges;
  • uses a simple running or average method, not your jurisdiction's mandated one;
  • may misclassify self-transfers as disposals (see internal transfer vs disposal);
  • excludes off-venue acquisitions that set the real basis.

The taxable gain needs a complete, cross-wallet, jurisdiction-correct computation, not a venue widget.

Practical guidance

  1. Isolate realized PnL for tax — disposals only, on the mandated basis method.
  2. Report unrealized PnL separately as performance, not as taxable gain.
  3. Attach fees to transactions — acquisition into basis, disposal against proceeds.
  4. Use a complete, cross-wallet history — not a single exchange's view.
  5. Set the basis method per jurisdiction — the formula is constant, the method is not.
  6. Keep performance PnL and taxable gain as distinct outputs of the same data.

Choosing a tool: separating performance from tax

A portfolio tracker and a tax engine are doing different jobs, and the gap matters most when a single tool claims to do both, as Koinly, CoinTracker and others do. Before you treat a tool's output as your taxable gain rather than a performance read, check that it:

  • pulls in every wallet and exchange, not just the venues with an easy API, since an off-venue acquisition sets the real basis;
  • attaches acquisition fees to basis and disposal fees to proceeds, rather than dropping them or netting them invisibly;
  • classifies wallet-to-wallet transfers as non-events, so they never appear as disposals in the realized line;
  • exposes the taxable figure as a separate output from the performance figure, rather than echoing the exchange's own PnL widget.

If a tool cannot show you the realized line on its own, on your jurisdiction's method, it is giving you performance dressed up as a tax number.

Worked example: realized PnL vs exchange-app display vs taxable gain

The following illustrates why three figures — exchange display, total portfolio PnL, and taxable gain — routinely disagree on the same activity.

Fact pattern: A US trader holds BTC on two platforms.

  • Exchange A: bought 1 BTC at $28,000 on 1 March 2025. Sold 1 BTC on 15 October 2025 for $62,000. Exchange fee: $62 (charged in USD, deducted from proceeds).
  • Exchange B: bought 0.5 BTC at $55,000 ($27,500 total) on 1 August 2025. Still held.
  • Self-transfer: moved 0.5 BTC from Exchange A to a hardware wallet in April 2025 before the sale.

What Exchange A's app shows: Exchange A's PnL widget sees a purchase at $28,000 and a sale at $62,000 — it displays a gain of $34,000. It does not know about the $62 fee, typically does not adjust for it, and shows no unrealized position because it cannot see Exchange B.

Correct realized PnL calculation (Exchange A disposal):

Realized PnL = $62,000 (proceeds) − $28,000 (cost basis, FIFO, per-wallet) − $62 (disposal fee) = $33,938

The holding period is over 7 months (March to October 2025), which for a US taxpayer is less than 12 months — short-term, taxed as ordinary income.

Self-transfer classification: The April 2025 movement of 0.5 BTC from Exchange A to the hardware wallet is a self-transfer between own wallets — not a disposal. It carries cost basis with it (half the $28,000 basis, i.e. $14,000) but generates no realized gain and is excluded from the taxable line. A tool that misclassifies this as a disposal would manufacture an additional $0 gain or loss (proceeds of $0 and basis of $14,000 = a phantom $14,000 loss), distorting both PnL and cost basis for the remaining units.

Unrealized PnL on Exchange B: The 0.5 BTC bought at $55,000 and still held is a paper position. If BTC is at $62,000 at period-end, the unrealized PnL = (0.5 × $62,000) − $27,500 = $3,500. This is portfolio performance — it feeds no taxable gain and is shown separately from the realized line.

Total performance PnL vs taxable gain:

MetricAmount
Exchange A realized gain (with fee)$33,938
Unrealized PnL on Exchange B$3,500
Total performance PnL$37,438
Taxable gain (realized only)$33,938

The two figures differ by the unrealized position. Both are computed from the same transaction history but answer different questions: performance answers "how did the portfolio do?"; taxable gain answers "what do I owe tax on?". Mixing them — reporting the $37,438 as taxable income — overstates tax; ignoring fees — reporting $34,000 — also overstates by $62.

Where Wag3s fits

Wag3s Folio computes realized PnL as proceeds minus cost basis minus fees on your jurisdiction's mandated method, across every wallet rather than a single venue, and keeps the unrealized performance view on a separate line so the two never blur. Self-transfers are excluded from the realized figure and carry their basis across, and fees are attached to the transactions they belong to. The result is a performance number and a taxable number that are each internally consistent. The taxable line is built to be reviewed by a qualified tax adviser before it reaches a return, not to substitute for that review.


Further reading

Sources

Editorial disclaimer
This article is informational and does not constitute tax or investment advice. PnL for performance and taxable gain are different computations; the latter is jurisdiction-specific. Confirm with a qualified adviser.